如果 iterable 中的项目导致拒绝,则强制继续 BlueBird Promise.each
Force continuation of BlueBird Promise.each if an item in the iterable causes a reject
所以我们想连续执行一系列承诺,但在拒绝时继续。在下面的示例中,我们可以控制拒绝,但在用例中我们无法控制拒绝,因为它来自 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
error item not number
如您所见,它在遇到数组中的字符串时退出。有什么办法让它一直延续到数组的末尾吗?
如果您对承诺的解决没有任何控制权,您可以通过在 each
看到它们之前处理拒绝来轻松获得它:
Promise.mapSeries(arr, function(item) {
return somethingThatMightReject()
.catch(function(err) {
// ignore it? Log it?
return /*reasonable result*/; // continue anyway
});
})
(在 Promise.each
而不是 mapSeries
的情况下,您不必 return 一个有意义的结果,而只需吞下错误)
所以我们想连续执行一系列承诺,但在拒绝时继续。在下面的示例中,我们可以控制拒绝,但在用例中我们无法控制拒绝,因为它来自 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
error item not number
如您所见,它在遇到数组中的字符串时退出。有什么办法让它一直延续到数组的末尾吗?
如果您对承诺的解决没有任何控制权,您可以通过在 each
看到它们之前处理拒绝来轻松获得它:
Promise.mapSeries(arr, function(item) {
return somethingThatMightReject()
.catch(function(err) {
// ignore it? Log it?
return /*reasonable result*/; // continue anyway
});
})
(在 Promise.each
而不是 mapSeries
的情况下,您不必 return 一个有意义的结果,而只需吞下错误)