我在另一个异步操作中有一个异步操作。我想知道我什么时候能完成所有工作。
这是我的代码:
msls.showProgress(msls.promiseOperation(function (operation) {
screen.Staff.getConfirmedWaiters().then(function (result) {
result.each(function (item) {
item.getWaiter().then(function (result) {
if (result.Gender == "Female") {
confirmedGirls++;
}
});
});
operation.complete(confirmedGirls);
});
}).then(function (result) {
首先我加载ConfirmedWaiters
集合。一旦完成,我迭代每个实体并加载子实体异步,所以我想知道迭代何时完成!?但问题是它会立即返回,因为它是异步的,所以我怎么能等到迭代完成然后再调用operation.complete()
?
答案 0 :(得分:3)
为了解决此类异步挑战,您需要加入您的承诺。
以下博客文章提供了一些有关promises的背景信息,对于任何LightSwitch HTML客户端开发人员来说都是一个有用的读物(总是值得注意的是,LightSwitch HTML主要基于WinJS,任何WinJS承诺相关材料都值得一读) - < / p>
Promises in LightSwitch (Justin Anderson)
All about promises (for Windows Store apps written in JavaScript)
基于第二篇博客文章中介绍的“加入并行承诺”方法,您的代码最终应该与以下内容类似,以达到预期效果(尽管它可能会遇到性别平等异常; - )
msls.showProgress(msls.promiseOperation(function (operation) {
screen.Staff.getConfirmedWaiters().then(function (result) {
var ps = [];
result.each(function (item) {
var p = item.getWaiter().then(function (result) {
if (result.Gender == "Female") {
confirmedGirls++;
}
});
ps.push(p);
});
WinJS.Promise.join(ps).then(function onComplete(result) {
operation.complete(confirmedGirls);
}, function onError(error) {
operation.error(error);
});
});
}).then(function (result) {
希望这应该可以解决问题。如果没有,上传示例项目以提供更多背景可能有所帮助。