在玩Promises以了解它们是如何工作的时候,我注意到了一些我无法解释的事情。
给出这个例子:
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'); }
);
这是意外的,因为两个Promise中的一个被拒绝,因此all
返回的Promise也应该被拒绝。
这里发生了什么 - 是否与返回值有关?我需要在某处返回一个新的Promise吗?
答案 0 :(得分:0)
你的两个例子看起来很相似,但并不相同。以下是then
的{{3}}(强调我的):
使用履行的履行价值或拒绝原因(视情况而定)调用
onFulfilled
或onRejected
并返回新承诺解析被叫处理程序的返回值
在您的第一个示例中,d
设置为B()
的结果,这是一个被拒绝的承诺。新承诺意味着记录了某些内容,但d
未更改。
在第二个示例中,d
更改为B().then(...)
的结果,这是已解决的承诺。
您可能希望在拒绝处理程序中throw
。
答案 1 :(得分:0)
您在第二种情况下禁止错误:
// d is promise which suppressed error from B()
var d = B().then(
function () { console.log('B success'); },
function () { console.log('B fail'); }
);
如果您希望d
被拒绝,也应该重新抛出错误:
var d = B().then(
function () { console.log('B success'); },
function (e) { console.log('B fail'); throw e; }
);