我需要等待几个承诺完成才能执行一些代码(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
承诺中,或者您是否可以考虑另一种等待动态增长的承诺的替代解决方案?
答案 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
});