在promise中执行拒绝状态后,其余promise也可以在程序中执行吗?

时间:2018-09-03 14:09:19

标签: javascript node.js promise

我使用的是承诺代码,尤其是使用Promise.all(),在我称为拒绝状态的函数之一中,因此一旦执行reject(failure)状态,它将捕获错误消息,其余的承诺不应该执行。这是承诺中的规则。但是在我的代码中,我称为拒绝状态。捕获功能捕获错误消息。好的。但是,控制又一次转到了其他承诺,并在我的代码中打印了日志语句。谁能解释为什么?

var p1 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    console.log("One dude");
    resolve("one");
  }, 3000);
});

var p2 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    reject("TWO");
  }, 1000);
});

var p3 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    console.log("Three dude");
    resolve("Three");
  }, 4000);
});


Promise.all([p1, p2, p3]).then(function(msg) {
  console.log(msg);
}).catch(function(err) {
  return console.log(err);
});

我得到了输出:

TWO
One dude
Three dude


I'm expecting output
TWO

1 个答案:

答案 0 :(得分:0)

三个承诺的setTimeouts彼此独立。

一个拒绝的事实与解决的两个无关。不管其他任何承诺如何进行,这三个promise构造函数中的每一个都将执行,并且无论是否将这些promise与Promise.all()进行汇总,都将执行此操作。

Promise.all()的聚集将查看承诺的最终结算,而不会影响导致其兑现的(通常是异步的)活动。

考虑到所有这些因素(以及传递给setTimeouts的时间值),(希望)您会发现:

  • 两个(1秒后)
  • 一个家伙(3秒后)
  • 三个家伙(4秒后)