我使用的是承诺代码,尤其是使用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
答案 0 :(得分:0)
三个承诺的setTimeouts彼此独立。
一个拒绝的事实与解决的两个无关。不管其他任何承诺如何进行,这三个promise构造函数中的每一个都将执行,并且无论是否将这些promise与Promise.all()
进行汇总,都将执行此操作。
与Promise.all()
的聚集将查看承诺的最终结算,而不会影响导致其兑现的(通常是异步的)活动。
考虑到所有这些因素(以及传递给setTimeouts的时间值),(希望)您会发现: