为$ q.all()添加承诺

时间:2016-09-09 08:50:41

标签: javascript angularjs promise angular-promise

我需要等待几个承诺完成才能执行一些代码(angularJS):

function get(token) {
$.ajax({
    url: "https://developer-api.nest.com",
    beforeSend: function(xhr) { 
      xhr.setRequestHeader("content-type", "application/json");
      xhr.setRequestHeader("authorization", "Bearer " + token);
    },
    method: 'GET',
    success: function (data) {
      alert(JSON.stringify(data));
    },
    error: function(err){
      console.log(JSON.stringify(err));
    }
});

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

修改初始数组

可悲的是,var promises = [calculationPromise1, calculationPromise2]; $q.all(promises) .then(function(){ notifyUser("I am done calculating!"); }); 不会监听promise数组的更改,因此执行此操作不会产生任何影响:

$q.all

创建新的$ q.all-promise

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

promises.push(newCalc);

递归通话

递归调用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!"); }) } 并仅执行.then块一次应该起作用:

$q.all

我的问题是angular没有提供API来检查我在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); } 函数中需要的promise的状态。我可以检查allPromisesResolved以确定已解决的承诺,但如果我不需要,我宁愿不使用内部变量(promise.$$state.status === 1)。

问题

是否有一种简单的方法可以将承诺添加到$$state承诺中,或者您是否可以考虑另一种等待动态增长的承诺的替代解决方案?

1 个答案:

答案 0 :(得分:4)

您可以通过递归完成此操作。每次调用$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
});