Zan*_*ger 17 javascript windows-8 winjs
我正在开发一个简单的Windows 8应用程序,我需要从网站上获取一组数据.我正在使用WinJS.xhr()来检索此数据,该数据返回Promise.然后我将一个回调传递给这个Promise的.then()方法,该方法为我的回调提供异步调用的返回值..then()方法返回另一个Promise,为其提供我的回调返回的值.这种查询的基本结构如下:
WinJS.xhr({ url: "http://www.example.com/" }).then(
function callback( result_from_xhr )
{
//do stuff
return some_value;
}).then(
function secondcallback( some_value )
{
//do stuff
});
Run Code Online (Sandbox Code Playgroud)
但是,在我的情况下,我可能需要根据第一个查询返回的数据进行额外的数据查询,并且可能还需要更多查询,具体取决于THAT数据......等等,递归查询.
我需要一种方法对其进行编码,以便在所有递归完成之前不执行最终的.then(),类似于:
function recurse() {
return WinJS.xhr({ url: "http://www.example.com/" }).then(
function callback( result_from_xhr )
{
if( result_from_xhr == something )
{
recurse();
}
});
}
recurse().then(
function final()
{
//finishing code
});
Run Code Online (Sandbox Code Playgroud)
问题是,当然,只要第一级递归完成,就会调用整理代码.我需要一些方法来在回调中嵌套新的promise和旧的promise.
我希望我的问题很清楚,我真的不确定如何解释它,坦率地说,异步递归代码的想法让我头疼.
Chr*_*res 13
我在这里要做的是创建一个全新的独立承诺,您可以手动完成,并从recurse()函数返回.然后,当你知道自己完成了异步工作时,完成了这个承诺.
当你有一套已知的承诺时,Promise.join会起作用 - 你需要在调用join之前提供整个promise数组.如果我遵循原始问题,您将拥有可变数量的承诺,并且可能会更多地作为异步工作的一部分弹出.在这些情况下,加入不是正确的工具.
那么,这看起来像什么?像这样的东西:
function doSomethingAsync() {
return new WinJS.Promise(function (resolve, reject) {
function recurse() {
WinJS.xhr({ url: "http://www.example.com/" })
.then(function onResult(result_from_xhr) {
if (result_from_xhr === something) {
recurse();
} else {
// Done with processing, trigger the final promise
resolve(whateverValue);
},
function onError(err) {
// Fail everything if one of the requests fails, may not be
// the right thing depending on your requirements
reject(err);
});
}
// Kick off the async work
recurse();
});
}
doSomethingAsync().then(
function final()
{
//finishing code
});
Run Code Online (Sandbox Code Playgroud)
我重新安排了递归发生的地方,这样我们就不会每次都重新创建一个新的promise,因此嵌套的recurse()函数而不是它在外层.
在制作我自己的Windows 8应用程序时,我可能以不同的方式解决了这个问题(我认为这是同样的问题).
我遇到此问题的原因是,默认情况下,对表的查询将进行分页,并且一次只返回50个结果,因此我创建了一个模式以获取前50个,然后是下一个50等,直到回复结果少于50,然后解决承诺.
这段代码不是真正的代码,只是为了说明:
function getAllRows() {
return new WinJS.Promise(function(resolve, reject){
var rows = [];
var recursivelyGetRows = function(skipRows) {
table.skip(skipRows).read()
.then(function(results){
rows = rows.concat(results);
if (results.length < 50) {
resolve(rows);
} else {
recursivelyGetRows(skipRows + 50);
}
})
}
recursivelyGetRows(0);
});
}
Run Code Online (Sandbox Code Playgroud)
所以getAllRows()返回一个只有在我们得到一个少于50个结果的结果后才能解析的promise(这表明它是最后一页).
根据您的使用情况,您可能也想在其中抛出错误处理程序.
如果不清楚,'table'是一个移动服务表.
您将需要使用 Promise.join().done() 模式。将 Promise 数组传递给 join(),在您的情况下,这将是 xhr 调用的集合。join() 仅当所有 xhr Promise 完成时才会调用 done()。您将获得传递给 did() 的结果数组,然后您可以对其进行迭代并通过新的 Promise.join().done() 调用重新开始。使用这种方法时需要注意的是,如果传递给 join() 的 Promise 之一失败,则整个操作将被视为错误条件。
抱歉,我现在没有时间尝试为您删除代码。如果有机会,我以后会努力的。但是您应该能够将其插入到您的递归函数中并使事情正常工作。
| 归档时间: |
|
| 查看次数: |
10286 次 |
| 最近记录: |