javascript – How to wait for multiple Promises to be completed similar to Promise.all

Question:

Promise.all returns a promise that is rejected if any of the promises passed to all are rejected. For example the following code:

const a = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("resolve 1");
    resolve(1);
  }, 2000);
});

const b = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("reject 2");
    reject(2);
  }, 1000);
});

const c = new Promise((resolve, reject) => {
  console.log("resolve");
  resolve(3);
});

Promise.all([a, b, c]).then(
  r => {
    console.log(r);
  },
  () => {
    console.log("err");
  },
);

will bring out

resolve 3
reject 2
err
resolve 1

those. everything ended without waiting for promise a to complete ( resolve 1 is printed after err ). The question is how to wait until all promises are fulfilled and/or rejected?

Answer:

Very simple: mask the error with a catch call.

const a = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("resolve 1");
    resolve(1);
  }, 2000);
});

const b = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("reject 2");
    reject(2);
  }, 1000);
});

const c = new Promise((resolve, reject) => {
  console.log("resolve 3");
  resolve(3);
});

Promise.all([a, b, c].map(p => p.catch(x => console.error(x)))).then(
  r => {
    console.log(r);
  }
);

Result: [1, undefined, 3].

Scroll to Top