Async & Promisesmedium

Implement Promise.all(promises)

Implement `Promise.all` from scratch. It should resolve with an array of results when all promises resolve, and reject immediately if any promise rejects.

Asked at Meta, TikTok, Apple, Amazon

#promises#async#concurrency

Answer

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    if (promises.length === 0) return resolve([])

    const results = new Array(promises.length)
    let remaining = promises.length

    promises.forEach((promise, i) => {
      Promise.resolve(promise).then((value) => {
        results[i] = value
        remaining -= 1
        if (remaining === 0) resolve(results)
      }).catch(reject)   // first rejection wins
    })
  })
}

// Test
promiseAll([
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.resolve(3),
]).then(console.log)  // [1, 2, 3]

promiseAll([
  Promise.resolve(1),
  Promise.reject('error'),
]).catch(console.error) // 'error'

Source: frontendinterviewhandbook.com

Practise more Async & Promises questions →