DEV Community

Shahzaib Khalid
Shahzaib Khalid

Posted on

Promise.all (ES2015) vs Promise.allSettled (ES2020). What's changed? 🤔

Hey! 👋

Check out today's ⚡️ Dev Tip 💡 👇

Follow me on Twitter @shahzaibkhalid for more Dev Tips! ✨

Let’s say we want to run many promises to execute in
parallel and wait till all of them are ready. 🧐

// some dummy promises to play with 🍭
const p1 = new Promise(resolve => resolve('Shahzaib'));
const p2 = new Promise((_ ,reject) => reject('User does not exists!'));
const p3 = new Promise(resolve => resolve('Lahore'));
Enter fullscreen mode Exit fullscreen mode

Promise.all (short-circuits if any of the promises is rejected)

If any of the passed promises is rejected, the promise
returned by Promise.all immediately rejects with that error. ❌

Promise.all([p1, p2, p3])
  .then(response => console.log(response))
  .catch(error => console.log(error)); // 👉'User does not exists!'
Enter fullscreen mode Exit fullscreen mode

Promise.allSettled (does not short-circuits)

Waits for all passed promises to settle (either resolved or rejected). 🥳

The resulting array has:

  • {status: 'fulfilled', value: result} - for successful responses
  • {status: 'rejected', reason: error} - for errors
Promise.allSettled([p1, p2, p3])
  .then(response => console.log(response));

/**
 * 👉 [ {status: 'fulfilled', value: 'Shahzaib'},
 *      {status: 'rejected', reason: 'User does not exists!'},
 *      {status: 'fulfilled, value: 'Lahore'} ] 🚀
 */
Enter fullscreen mode Exit fullscreen mode

Hope you learned something new today. Do let me know what do you think about this Dev Tip in the comments below. 👀

Peace. ✌️

Oldest comments (6)

Collapse
 
anduser96 profile image
Andrei Gatej

Thanks for sharing!

As far as I know, you can achieve the same result with Promise.all by attaching a ‘.catch()’ to each promise in your array.

Collapse
 
shahzaibkhalid profile image
Shahzaib Khalid

Yes, we could but Promise.allSettled is more concise. 🚀

Collapse
 
amcsi profile image
Attila Szeremi⚡

I think you can only handle the first error that way, not the other errors or successes.

Collapse
 
dean profile image
dean • Edited

I feel like for consistency, it should be status: 'resolved' rather than status: 'fulfilled'. Otherwise, that's pretty neat!

The concept is great, but some renaming I think would be nice. I think the most important renaming should be status: 'resolved' rather than 'fulfilled', and perhaps renaming Promise.allSettled to something else... Not quite sure yet.

Collapse
 
shahzaibkhalid profile image
Shahzaib Khalid

Dean, the specification uses the following naming convention:

  • fulfilled - The action relating to the promise succeeded
  • rejected - The action relating to the promise failed
  • pending - Hasn't fulfilled or rejected yet
  • settled - Has fulfilled or rejected
Collapse
 
dean profile image
dean

Just looked this up on MDN, didn't know that this was the current specification! Thanks for letting me know.