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].