在Bluebird.all结束之前中断

时间:2018-09-12 15:35:29

标签: javascript promise bluebird

如果在等待的承诺之一中抛出错误,是否有任何方法可以停止P.all的执行?

在此示例中,我希望在“ A-1000”之后而不是在“ B-100000”之后看到“ THE_END”

const P = require("bluebird");


const p1 = P.resolve().then(() => {
  for(let i = 0 ; i <= 1000 ; i++) {
    console.log("A - ", i);
  }
  return Promise.reject(new Error('error'))
});

const p2 = P.resolve()
  .then(() => {
    for(let i = 0 ; i <= 100000 ; i++) {
      console.log("B - ", i);
    }
  });

return P.all([p1, p2])
  .catch(() => console.error("THE_END"));

2 个答案:

答案 0 :(得分:0)

使用P.some而不是使用P.all并传递承诺数量:

  

如果太多的承诺被拒绝,从而使该承诺永远无法兑现,则将立即以AggregateError拒绝原因(按其提交顺序)将其拒绝。

return P.all([p1, p2], 2).catch(() => console.error('error'));

但是请注意,您的假设示例无论如何都无法按预期运行,因为您反复console.log的“忙循环”会阻塞浏览器的事件循环。

答案 1 :(得分:-1)

是的,例如,您可以添加一个函数来在执行P.all之前检​​查二进制变量是否设置为0。然后,例如,当它被调用一次时,您可以将其设置为1。