Принудительное продолжение обещания BlueBird.каждый, если элемент в итерируемом вызывает отклонение

#javascript #loops #promise #bluebird

#javascript #циклы #обещание #bluebird

Вопрос:

Итак, мы хотели бы выполнить список обещаний последовательно, но продолжить отклонять. В приведенном ниже примере у нас есть контроль над отклонением, но в случае использования у нас не будет контроля над отклонением, поскольку оно исходит от Mongoose .

 let Promise = require('bluebird');
let arr = [1,2,'a',4,5];

Promise.each(arr, function(item) {
        return new Promise((resolve, reject) => {
            if (typeof item === 'number') {
                console.log(item);
                resolve(item);
            } else {
                reject(new Error('item not number'));
            }
        });
    })
    .then(res => { console.log(res) })
    .catch(err => {console.log('error '   err.message)});
  

Что дает:

1

2

ошибка элемент не номер

Как вы можете видеть, он завершается, когда попадает в строку в массиве. Есть ли какой-либо способ заставить его продолжаться до конца массива?

Ответ №1:

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

 Promise.mapSeries(arr, function(item) {
    return somethingThatMightReject()
    .catch(function(err) {
        // ignore it? Log it?
        return /*reasonable result*/; // continue anyway
    });
})
  

(в случае Promise.each нет mapSeries , вам не нужно возвращать значимый результат, а просто проглотить ошибку)

Комментарии:

1. Казалось бы, возврат не требуется (внутри catch) для продолжения обещания?

2. @wayofthefuture верно, я подумал mapSeries и забыл, что each для этого не нужен полезный результат