How to Use async/await inside map() in JavaScript
I recently needed to use async/await inside a map function.
Suppose I have a list of ids, and I want to make an API call on each id.
const ids = ["id_1", "id_2", "id_3"];
const dataById = ids.map((id) => {
// make API call
});
API calls are generally asynchronous, so the natural progression would be to make the function passed into map() an async function.
const ids = ["id_1", "id_2", "id_3"];
const dataById = ids.map(async (id) => {
const data = await getDataById(id);
return { id, data };
});
Unfortunately, making the map() function asynchronous means that map() will return an array of promises.
[Promise {<pending>}, Promise {<pending>}, Promise {<pending>}]
In order to retrieve the results of all the promises, we can use Promise.all().
We can return Promise.all() on the array of promises.
Promise.all(dataById);
Notice, however, that Promise.all() itself will return a promise, so we can await the result of this line.
await Promise.all(dataById);