Waiting For All Promises to Execute in JavaScript (Even if There Are Errors)
Promise.all takes an array of promises to run all at once and stops either when all promises are successful or when one promise is rejected. In a lot of cases this is what is wanted. Though sometimes all promises need to be waited for no matter what and the operations should happen in parallel. For example, to track all errors found so a unified error message can be generated. Here is what happens when using Promise.all:
// Simulated API Calls function api1() { return new Promise((resolve, reject) => { setTimeout(() => reject('Error 1'), 200); }); } function api2() { return new Promise((resolve, reject) => { setTimeout(() => resolve(['some', 'data']), 300); }); } function api3() { return new Promise((resolve, reject) => { setTimeout(() => reject('Error 2'), 400); }); } async function displayAllResults() { try { const results = await Promise.all([api1(), api2(), api3()]); console.log('results', results); // (never called) } catch (err) { console.log(err); // Error 1 } } displayAllResults();
Instead a function that only is fulfilled when all promises have run (Promise.allSettled) no matter what:
async function displayAllResults() { try { const results = await Promise.allSettled([api1(), api2(), api3()]); const errors = results.filter((result) => result.status === 'rejected'); console.log(errors.map((error) => error.reason)); // [ 'Error 1', 'Error 2' ] } catch (err) { console.info(err); // (never called) } } displayAllResults();
This function will soon be available in native JavaScript: https://github.com/tc39/proposal-promise-allSettled. Here is my implementation to demonstrate the above:
if (typeof Promise.allSettled !== 'function') { const alwaysResolveWrapper = function(promise) { return promise.then((value) => { return { status: 'fulfilled', value }; }, (err) => { return { status: 'rejected', reason: err }; }); } Promise.allSettled = function(promises) { return Promise.all(promises.map((promise) => { return alwaysResolveWrapper(promise); })); } }
Github Location: https://github.com/Jacob-Friesen/obscurejs/blob/master/2019/allSettled.js














