我有两个彼此独立的诺言,我想在两个诺言都完成(拒绝或解决)之后做最后一步。

$ 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/

10-11 06:08