DEV Community

Matan Shaviro
Matan Shaviro

Posted on • Edited on

Your own Promise.all

In modern JavaScript development, handling asynchronous operations efficiently is essential, especially when multiple tasks need to run simultaneously. That’s where Promise.all comes in—a powerful method that allows you to execute several promises at once, waiting for all of them to resolve (or for one to reject) before proceeding. In this post, we’ll dive into how Promise.all works, why it’s such a valuable tool for managing concurrent asynchronous operations, and how you can implement it yourself to deepen your understanding of JavaScript promises.
Let’s get started!

Example usage

const p1 = Promise.resolve(1)
const p2 = Promise.resolve(2)
const p3 = Promise.resolve(3)

customPromiseAll([p1, p2, p3])
  .then((res) => console.log(res))
  .catch(console.error)
Enter fullscreen mode Exit fullscreen mode

When we start writing the function, we’ll first define a variable named result to hold all the responses from the promises.
Then, we’ll return a new instance of Promise with resolve and reject.

function customPromiseAll(promises) {
  let result = []
  return new Promise((resolve, reject) => {

  })
}
Enter fullscreen mode Exit fullscreen mode

Now, we’ll iterate over the array of promises that the function receives using forEach, handling each resolved promise like this: each resolved promise will be inserted into the result array.

function customPromiseAll(promises) {
  let result = []
  return new Promise((resolve, reject) => {
    promises.forEach((promise) => {
      promise
        .then((res) => {
          result.push(res)

        })
    })
  })
}
Enter fullscreen mode Exit fullscreen mode

We’ll check an edge case: if the length of promises is equal to the length of result, then we will resolve with result.

function customPromiseAll(promises) {
  let result = []
  return new Promise((resolve, reject) => {
    promises.forEach((promise) => {
      promise
        .then((res) => {
          result.push(res)
          if (result.length === promises.length) {
            resolve(result)
          }
        })
    })
  })
}
Enter fullscreen mode Exit fullscreen mode

Finally, we’ll add .catch in case any of the promises return an error.

function customPromiseAll(promises) {
  let result = []
  return new Promise((resolve, reject) => {
    promises.forEach((promise) => {
      promise
        .then((res) => {
          result.push(res)
          if (result.length === promises.length) {
            resolve(result)
          }
        })
        .catch(reject)
    })
  })
}
Enter fullscreen mode Exit fullscreen mode

Sentry blog image

How I fixed 20 seconds of lag for every user in just 20 minutes.

Our AI agent was running 10-20 seconds slower than it should, impacting both our own developers and our early adopters. See how I used Sentry Profiling to fix it in record time.

Read more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay