Await multiple promises in JavaScript

Let’s say I have two promises: the former resolves in three seconds, while the latter resolves in five. I need to wait for both of these before moving on to the next code block.

Depending on how you structure your promises, you will either have to wait five seconds or eight seconds before moving on.

What is the best way to await multiple promises?

Await happy

My first instinct in the above scenario was to use to await both promises. await is such a useful keyword in modern JS, that I tend to throw it places without a second thought:

await promiseOne() // Resolves in three seconds
await promiseTwo() // Resolves in five seconds

console.log('done')

This looks neat and clean, but how long will it take to resolve? 8 seconds.

Look back at the first line. We’re asking the JavaScript engine to await the resolution of promiseOne. In effect, we’re asking it to twiddle its thumbs for three seconds while we wait on the promise.

When the first resolves, then JavaScript quickly moves on to the next promise. After waiting for five seconds, it moves on to the log. 3 seconds + 5 seconds = 8 seconds.

Can we reduce that wait time by refactoring?

Call then await

Instead of reaching straight for await, let’s think this through: we want to start both promises, then wait for their resolution. So let’s change it up:

const promiseOnePromise = promiseOne()
const promiseTwoPromise = promiseOne()

await promiseOnePromise
await promiseTwoPromise

console.log('done')

How long will it take this code to resolve? 5 seconds (roughly).

By calling the functions that return promises initially, we are “starting the timer” for both. So the three-second and five-second promises are resolving in tandem.

When we await after calling the promises, we’ll only wait as long as the slowest promise: five seconds in this case.

This is great, but there is one more solution that might be easier.

Promise.all

The Promise object has an all method that accepts any number of promises and resolves when all have been fulfilled. We just need to pass it an iterable like an array:

await Promise.all([promiseOne(), promiseTwo()])

console.log('done')

This functions in a similar manner to the previous “call then await” example but is more succinct. In my tests, it was fractions of a millisecond slower, but your mileage may vary.

Live example

You can view a live example of this code on Repl:

Conclusion

There we go! Two solutions for how to await multiple promises in JavaScript. Hope that helped!

Happy coding!

Isaiah 40:31 (SDG)

My name is Sean McPherson, and I am a software engineer and educator in Pittsburgh, PA. In the past, I have given conference talks, lead workshops, and organized meetups. Here I write articles about programming for developers of all levels.