DEV Community

Discussion on: How to use async/await with .map in js

Collapse
 
jordandev profile image
Jordan Jaramillo

yes, it is a good question I will give you an example that will solve your doubt.

Promise.all([
  Promise.resolve(20),
  Promise.reject("there was an error"),
  new Promise((resolve) => setTimeout(() => resolve(30), 300)),
])
  .then((values) => console.log(values))
  .catch((err) => console.error(err));


Promise.allSettled([
  Promise.resolve(20),
  Promise.reject("there was an error"),
  new Promise((resolve) => setTimeout(() => resolve(30), 300)),
]).then((values) => console.log(values));

Enter fullscreen mode Exit fullscreen mode

In the promise.all if a call fails then it will not enter the then but it will go directly to the catch.

But if you need it to return everything with its states you can use Promise.allSettled which will return an array with the status of each of the promises

script log

❯ node index.js
there was an error
[
   { status: 'fulfilled', value: 20 },
   { status: 'rejected', reason: 'there was an error' },
   { status: 'fulfilled', value: 30 }
]
Enter fullscreen mode Exit fullscreen mode
Collapse
 
thuutri2710 profile image
Tris

Agree with you @jordan Jaramillo. Btw, we can also use Promise.all to resolve this problem. Assume that we're fetching many requests. If one of them is successful, we'll return:

{
  value: 20,
  status: success
}
Enter fullscreen mode Exit fullscreen mode

Otherwise

{
 value: null,
 status: failed
}
Enter fullscreen mode Exit fullscreen mode

How about your thought?

Thread Thread
 
jordandev profile image
Jordan Jaramillo

The problem with promise.all is that you will not be able to access which ones were resolved correctly since it directly passes to the catch.

Thread Thread
 
thuutri2710 profile image
Tris

I mean that if any request is failed, we still use resolve instead of reject. We only change the returned status.

{
  value: null,
  status: failed,
}
Enter fullscreen mode Exit fullscreen mode
Thread Thread
 
jordandev profile image
Jordan Jaramillo

yes, you can do it that way, it's a good idea I hadn't thought about it but if you want to have it automatically you can use allSettled.

Thread Thread
 
thuutri2710 profile image
Tris

Agree !!!