我有两个彼此独立的诺言,我想在两个诺言都完成(拒绝或解决)之后做最后一步。
$ q.all()不能使用,因为即使任何一个promise拒绝,我都希望finally总是执行(两个promise只能执行一次)
一种解决方案是在两个promise都被解析/拒绝时,拥有一个计数器并具有一个finallyHandler函数来执行它。
var count = 0;
function finallyHandler() {
if ( ++count === 2 ) {
doStuff();
count = 0;
}
}
firstPromise.finally(finallyHandler);
secondPromise.finally(finallyHandler);
这可以工作,但看起来不正确。
有什么更好的方法吗?
最佳答案
通常,$q.all
在第一个被拒绝的承诺中解决被拒绝的问题,并且不等待其他承诺。要等待所有承诺解决已实现或已拒绝的问题,请为每个承诺创建弹性版本,然后在这些承诺上使用$q.all
:
var resiliantFirstPromise = firstPromise.catch(e => "CONVERTED");
var resiliantSecondPromise = secondPromise.catch(e => "CONVERTED");
$q.all([resiliantFirstPromise, resiliantSecondPromise])
.then(() => {
console.log("Both promises have resolved");
});
通过将值返回到
.catch
方法,每个被拒绝的承诺都会返回派生的承诺,该承诺已转换为已实现的承诺。由于两个派生的诺言都不被拒绝,因此$q.all
将等待两个诺言都得到解决(实现或拒绝)。关于javascript - 如何在AngularJS中为多个promise提供单个finally处理程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41450717/