在与Promises玩弄了解他们如何工作时,我注意到了一些我无法解释的东西。Promise.all - 解决回调火灾,虽然承诺被拒绝
考虑这个例子:
var A = function() {
return Promise.resolve();
};
var B = function() {
return Promise.reject();
};
var c = A();
var d = B();
c.then(
function() { console.log('A success'); },
function() { console.log('A fail'); }
);
d.then(
function() { console.log('B success'); },
function() { console.log('B fail'); }
);
Promise.all([c, d]).then(
function() { console.log('all success'); },
function() { console.log('all fail'); }
);
第一单的决心/拒绝回调火,其次是Promise.all
拒绝回调。这是预期的,因为B
拒绝承诺。
但是,当这样写的,中Promise.all
火灾决心回调:
var A = function() {
return Promise.resolve();
};
var B = function() {
return Promise.reject();
};
var c = A().then(
function() { console.log('A success'); },
function() { console.log('A fail'); }
);
var d = B().then(
function() { console.log('B success'); },
function() { console.log('B fail'); }
);
Promise.all([c, d]).then(
function() { console.log('all success'); },
function() { console.log('all fail'); }
);
,因为这两个承诺之一被拒绝,所以无极返回由all
也应该被拒绝这是出乎意料的。
这里发生了什么 - 确实与返回值有关吗?我需要在某处返回一个新的承诺吗?
完全预期的行为,因为你的处理exeption ..不要处理你的期望,然后你的一切都会抓住他们。或者在拒绝处理程序中返回拒绝。 – Keith
你并没有等待'B',你正在等待'B'的'then'返回的承诺。 – mrmcgreg
在第一个函数中,您已经在第一个'then'调用中发现了错误,并且之后的promise链会自动重置,因为错误已被处理。 – adeneo