Optimizing Asynchronous Operations in JavaScript with Promise.all

Rehmat Sayany
2 min readJul 31, 2023

--

Asyn await JS

In JavaScript, async/await keywords have made working with Promises much simpler, allowing us to write asynchronous code that looks and behaves like synchronous code. However, it's crucial to use these tools wisely to get the most out of the asynchronous nature of JavaScript. In this post, we're going to talk about a common pitfall when using multiple await statements and how to avoid it.

Understanding the await Keyword

In an async function, the await the keyword makes JavaScript wait until the Promise settles, and then it resumes the function's execution and returns the resolved value. While it's waiting, other code outside the function can continue running. Here's a basic example:javascriptCopy code

async function fetchData(url) {
console.log('start');
let response = await fetch(url);
let data = await response.json();

console.log(data);
}
fetchData('/api/data');
console.log('Continue Executing this code while its awaiting for response from fetch');

In this example, JavaScript starts fetching the data, “steps outside” the function to wait for the Promise to resolve, and then steps back in to resume the function once the data is fetched.

The Pitfall of Multiple await Calls

If you have multiple Promises that don’t depend on each other, using await each one sequentially can lead to unnecessary delays. This is because each await expression makes the function wait for that specific Promise to resolve before it moves on to the next line of code.

// Sequential execution using await
async function fetchAllData() {
const data1 = await fetchData1();
const data2 = await fetchData2();
return [data1, data2];
}

In this example, fetchData2() doesn't start until fetchData1() has completed. If these two tasks are independent, it would be more efficient to start them at the same time.

Enter Promise.all

The Promise.all method is a powerful tool for optimizing asynchronous operations in JavaScript. It accepts an array of Promises and returns a new Promise that resolves when all the input Promises have been resolved. Here's how you can use Promise.all to fetch data1 and data2 at the same time:

// Parallel execution using Promise.all
async function fetchAllData() {
const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
return [data1, data2];
}

In this version of fetchAllData(), fetchData1() and fetchData2() start at the same time. As a result, the total wait time is only as long as the longest Promise. If fetchData1() takes 2 seconds and fetchData2() takes 3 seconds, the function will take roughly 3 seconds, not 5.

Conclusion

The await keyword and Promise.all method are both powerful tools for managing asynchronous operations in JavaScript. The key is to choose the right tool for the job. If your Promises depend on each other, use await to handle them sequentially. But if your Promises are independent, use Promise.all to handle them in parallel and make your code more efficient. As with many things in programming, the best choice depends on your specific situation.

--

--

Rehmat Sayany
Rehmat Sayany

Written by Rehmat Sayany

Full Stack developer @westwing passionate about NodeJS, TypeScript, React JS and AWS.

No responses yet