Tiago Bértolo
Tiago Bértolo

Reputation: 4343

Filter/recover Promise.all result

Ex:

function myFunc(args ...){
  ...
  return Promise.all(myPromisesArray)
}

If a promise inside myPromisesArray fails, i will only get the rejection reason in the return value.

Is there a way to recover all the other resolved values?

Upvotes: 2

Views: 717

Answers (1)

Freyja
Freyja

Reputation: 40804

If you're using Q, then there's a function called Q.allSettled that basically does what you ask for.

Otherwise, this simple function will give you the results of all promises, and tell you whether the succeeded or failed. You can then do whatever you need to do with the promises that succeeded or failed.

/**
 * When every promise is resolved or rejected, resolve to an array of
 * objects
 *   { result: [ Promise result ], success: true / false }
**/
function allSettled(promises) {
  return Promise.all(
    promises.map(
      promise => promise.then(
        // resolved
        (result) => ({ result: result, success: true }),
        // rejected
        (result) => ({ result: result, success: false })
      )
    )
  );
}

// example usage:
const one = Promise.resolve(1);
const two = Promise.reject(2);
const three = Promise.resolve(3);

allSettled([ one, two, three ])
  .then((results) => {
    console.log(results[0]); // { result: 1, success: true }
    console.log(results[1]); // { result: 2, success: false }
    console.log(results[2]); // { result: 3, success: true }
  });

Upvotes: 5

Related Questions