Перерыв до конца Bluebird.all - PullRequest
       5

Перерыв до конца Bluebird.all

0 голосов
/ 12 сентября 2018

Есть ли способ остановить выполнение P.all, если в одном из ожидаемых обещаний выдается ошибка?

В этом примере я ожидал увидеть "THE_END" после "A - 1000",а не после "B - 100000"

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 голосов
/ 12 сентября 2018

Вместо использования P.all, используйте P.some и передайте количество обещаний:

Если слишком много обещаний отклонено, так что обещание никогда не может быть выполнено, он будет немедленно отклонен с AggregateError из причин отклонения в том порядке, в котором они были добавлены.

т.е.

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

однако обратите внимание, что ваш гипотетический пример выигралвсе равно не будет работать так, как нужно, потому что ваш "занятый цикл" повторных вызовов на console.log свяжет цикл событий браузера.

0 голосов
/ 12 сентября 2018

Да, вы можете, например, добавить функцию, чтобы проверить, установлена ​​ли двоичная переменная в 0, перед выполнением P.all.Затем, когда он вызывается, например, один раз, вы можете установить его на 1.

...