Promise.all - 虽然Promise被拒绝,但解决了回调攻击

时间:2016-11-04 23:25:02

标签: javascript promise

在玩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吗?

2 个答案:

答案 0 :(得分:0)

你的两个例子看起来很相似,但并不相同。以下是then的{​​{3}}(强调我的):

  

使用履行的履行价值或拒绝原因(视情况而定)调用onFulfilledonRejected并返回新承诺解析被叫处理程序的返回值

在您的第一个示例中,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; }
);