[英]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.