#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
для этого не нужен полезный результат