wayofthefuture wayofthefuture - 1 year ago 99
Javascript Question

Force continuation of BlueBird Promise.each if an item in the iterable causes a reject

So we would like to execute a list of promises in serial, but continue on reject. In this example below, we have control over the reject, but in the use case we will not have control over reject as it is coming from 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') {
} else {
reject(new Error('item not number'));
.then(res => { console.log(res) })
.catch(err => {console.log('error ' + err.message)});

Which yields:



error item not number

As you can see it quit when it hit the string in the array. Is there any way to make it continue to the end of the array?

Answer Source

If you don't have any control over the resolution of the promise, you can easily gain it by handling the rejections before each sees them:

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

(in case of Promise.each not mapSeries, you don't have to return a meaningful result but just have to swallow the error)

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download