如果 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 一个有意义的结果,而只需吞下错误)