gpt4 book ai didi

javascript - 向 $q.all() 添加 promise

转载 作者:行者123 更新时间:2023-11-30 09:44:38 24 4
gpt4 key购买 nike

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

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 并只执行一次 .then block 应该可行:

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);
}

我的问题是 Angular 没有提供 API 来检查我在 allPromisesResolved 函数中需要的 promise 状态。我可以检查 promise.$$state.status === 1 来识别已解决的 promise ,但如果我不这样做,我宁愿不使用内部变量 ($$state)必须。

问题

有没有一种简单的方法可以向 $q.all promise 添加 promise,或者您能想到一个替代解决方案来等待动态增长的 promise 数量吗?

最佳答案

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

关于javascript - 向 $q.all() 添加 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39407532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com