如何'$ .all'一系列动态的承诺?

时间:2016-02-06 23:27:12

标签: javascript angularjs promise

假设我们有3个承诺,我们将它们传递给$ q.all。这将返回一个新的承诺,在3个承诺得到解决时解决。

现在,如果在3个承诺得到解决之前,我实际上决定我希望第4个承诺得到解决,这可以做到吗?

我尝试过类似的事情:

var promises = [promise1, promise2, promise3];
var allDone = $q.all(promises);
promises.push(promise4);

在上文中,allDone在前3个承诺得到解决后立即得到解决,但我希望它等待第4个承诺。

或者我在这里错过了承诺的意义?也许我不应该对这种情况使用承诺?

更新:正如所回答的那样,$ q.all无法满足我的需求。我的问题:有没有另一种方法可以知道什么时候动态的一组承诺得到解决,所以即使这个集合发生了变化?

2 个答案:

答案 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);