假设我们有3个承诺,我们将它们传递给$ q.all。这将返回一个新的承诺,在3个承诺得到解决时解决。
现在,如果在3个承诺得到解决之前,我实际上决定我希望第4个承诺得到解决,这可以做到吗?
我尝试过类似的事情:
var promises = [promise1, promise2, promise3];
var allDone = $q.all(promises);
promises.push(promise4);
在上文中,allDone
在前3个承诺得到解决后立即得到解决,但我希望它等待第4个承诺。
或者我在这里错过了承诺的意义?也许我不应该对这种情况使用承诺?
更新:正如所回答的那样,$ q.all无法满足我的需求。我的问题:有没有另一种方法可以知道什么时候动态的一组承诺得到解决,所以即使这个集合发生了变化?
答案 0 :(得分:1)
如果您可以查看$q all()函数的源代码,您将看到它只是通过forEach()传递所有promise并返回另一个将在稍后解析所有结果的promise。
因此,如果你将另一个承诺推入数组,它根本不会影响它,因为它已经设置了所有的承诺并完成了你的promises数组。
答案 1 :(得分:1)
您不能在事后添加承诺,并期望它影响之前的let arrayOfActions = [action2, action3, action4,..] //complete with the actions
self.scene?.runAction(arrayOfActions[arc4random_uniform(UInt32(colors.count))])
。这不是.all()
的工作方式。你可以这样做:
.all()
或者,您可以放弃var promises = [promise1, promise2, promise3];
var allDone = $q.all(promises);
$q.all([allDone, promise4]).then(function() {
// all four promises are done here
});
承诺并重新制作一个新的allDone
,如下所示:
.all()
根据您的评论,这是另一种可能性。假设您想要调用的最终完成处理程序位于名为var promises = [promise1, promise2, promise3];
var allDone = $q.all(promises);
promises.push(promise4);
var all4Done = $q.all(promises);
的函数中。然后,你可以这样做:
allDoneNow()
或者,如果你想要它递归,所以它继续检查更多,你可以将它放在这样的函数中,可以递归使用:
var promises = [promise1, promise2, promise3];
var allDone = $q.all(promises);
allDone.then(function(results) {
// if no new promises have been added to the array
if (promises.length === results.length) {
// call our final handler
return allDoneNow(results);
} else {
// wait for any new promises
return $q.all(promises).then(allDoneNow);
}
});
promises.push(promise4);