繁体   English   中英

向$ q.all()添加承诺

[英]Add promise to $q.all()

在执行一些代码(angularJS)之前,我需要等待几个承诺完成:

var promises = [calculationPromise1, calculationPromise2];
$q.all(promises)
   .then(function(){
        notifyUser("I am done calculating!");
    });

在我的情况下,用户将可以随时添加新的计算。 因此,如果他添加新的计算,则通知应进一步延迟。

修改初始数组

遗憾的是, $q.all不会监听promise数组上的更改,因此执行此操作不会产生任何效果:

promises.push(newCalc);

创建一个新的$ q.all-promise

这也不起作用,因为通知将显示多次而不是被延迟:

var promises = [calculationPromise1, calculationPromise2];
var qAllPromise; 

qAllPromise = $q.all(promises)
   .then(function(){
         notifyUser("I am done calculating!");
    })

function addAnotherCalculation(calc){
   qAllPromise = $q.all([calc, qAllPromise])
     .then(function(){
         notifyUser("I am done calculating!");
     })
}    

递归调用

递归调用$q.all并仅执行一次$q.all块应该可以工作:

var promises = [calculationPromise1, calculationPromise2];

function notifyWhenDone() {
$q.all(promises)
   .then(function() {
      if(allPromisesResolved()){
          notifyUser("I am done calculating!");
      }
      else {
          notifyWhenDone();
      }
    })
}

function addAnotherCalculation(calc){
   promises.push(calc);
}

我的问题是,角度没有提供API来检查我在allPromisesResolved函数中所需的承诺状态。 我可以检查promise.$$state.status === 1来标识已解决的promise,但我宁愿不要使用内部变量( $$state )。

有没有一种简单的方法可以将承诺添加到$q.all承诺中,或者您能想到一种替代解决方案来等待数量不断增长的承诺?

您可以通过递归来实现。 您可以在每次调用$q.all()时清空promises数组,然后在进入then()处理程序时检查它是否具有任何新值:

var promises = [calculationPromise1, calculationPromise2];

function waitForPromises(completedSoFar) {
    var p = $q
        .all((completedSoFar || []).concat(promises))
        .then(function (results) {
             return promises.length
                 ? waitForPromises(results)
                 : results;
        });

    promises = [];

    return p;
}

waitForPromises().then(function (results) {
    // all done
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM