Каждое обещание Bluebird: продолжить итерацию, если обещание отклонено - PullRequest
1 голос
/ 19 апреля 2020

Согласно онлайн-документации обещаний Bluebird, "каждый метод" ( LINK ) останавливает итерацию, если одно обещание отклонено. Есть ли способ заставить его продолжить и завершить все итерации? Если нет, что я должен использовать вместо этого? Я ищу способ:

  • повторять последовательно по массиву (то есть: дождаться завершения предыдущего обещания, прежде чем продолжить следующую итерацию)
  • всегда продолжать итерацию, даже если некоторые случаются отклонения обещаний
  • возможность вложения более одного l oop

Я до сих пор работал с этим кодом, но считаю его довольно громоздким и хотел бы перейти на более легкий / родной кусок кода.

var promiseFor = Promise.method(function(condition, action, value) {
if (!condition(value)) return value;
   return action(value).then(promiseFor.bind(null, condition, action));
});

return promiseFor(function(count){
   return count < someArray.length;
}, function(count){

   //foo...       
   return ++count;
}, 0)

1 Ответ

0 голосов
/ 19 апреля 2020

Простейшим было бы просто добавить функцию .catch(() => {}) для восстановления после того, что выбрасывает.

при нативном подходе просто используйте async / await

async function doWork (array) {
  for (let value of array) {
    if (condition) break
    await action(value).catch(() => { /* recover */ })
  }
}

с async / await вы также можете использовать try / catch

async function doWork (array) {
  for (let value of array) {
    if (condition) break
    try {
      await action(value)
    } catch (err) { }
  }
}
...