【发布时间】:2017-03-18 21:38:00
【问题描述】:
在玩弄 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。
但是当写成这样时,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 吗?
【问题讨论】:
-
完全预期的行为,因为您处理异常......不要处理您的期望,然后您的所有人都会抓住它们。或者在您的拒绝处理程序中返回拒绝。
-
你不是在等待
B,你是在等待B的then返回的promise。 -
在第一个调用中,您已经在第一个
then调用中发现了错误,并且在处理了错误之后,promise 链会自行重置。
标签: javascript promise