권현우의 프로필 사진

Hyunwoo

Promise all 구현기

Promise.all() 을 직접 구해본 경험

2025.08.13

  • javascript

Promise.all

Promise.all()은 순회 가능한 여러개의 promise들을 인자로 받아서 하나의 Promise를 반환하는 메서드이다. 이때 인자로 받은 promise 들이 모두 fulfilled(이행) 상태가 되면 returned 된 promise가 fulfilled 상태가 되고, 배열의 형태로 Fulfilled된 값들이 담겨져서 반환된다. 만약 인자로 받은 promise 중 하나라도 rejected(거부) 상태가 되면 returned 된 promise는 rejected 상태가 된다. (이때 promise들 중 첫번째로 rejected 된 reason이 반영된다.)

구현코드

Promise.all()을 직접 구현해보았다.

function promiseAll(values) {
  const result = new Array(values.length).fill(null)
  let cnt = 0
 
  return new Promise((resolve, reject) => {
    for (let i = 0; i < values.length; ++i) {
      Promise.resolve(values[i])
        .then((v) => {
          ++cnt
          result[i] = v
          if (cnt === values.length) {
            resolve(result)
          }
        })
        .catch((err) => {
          resolve(err)
        })
    }
  })
}

핵심로직은 아래와 같다.

  • Promise를 순회하면서 각 promise가 fulfilled된 상태를 then을 통해 확인하고, 각 Fulfilled된 value를 result 배열에 담는다.
  • fulffilled된 상태를 체크하면서 cnt를 증가시키고 cnt가 values.length와 같아지면 resolve를 호출하여 result 배열을 반환한다.
  • 만약 promise 중 하나라도 rejected 상태가 되면 catch를 통해 resolve(err)를 호출하여 에러를 반환한다.

구현 코드 테스트

await를 사용하기 위해 즉시 실행함수로 감싸주었다. 결과값은 주석과 같다.

;(async () => {
  console.log(await promiseAll([1, 2, '3', Promise.resolve(4)])) // [ 1, 2, '3', 4 ]
 
  console.log(await promiseAll([Promise.resolve(5), Promise.resolve(6), Promise.resolve(7), Promise.resolve(8)])) // [ 5, 6, 7, 8 ]
 
  console.log(await promiseAll([Promise.reject('9'), Promise.reject('10'), '11', Promise.resolve(12)])) // 9
})()

reference

Promise 관련 참고사항

선언하는 것 만으로 promise 시작된다

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('fulfilled!')
  }, 1000)
})

Promise.resolve()

Promise.resolve() -> 무조건 성공하는 promise로 바꿔줌,

Promise.resolve('fulfilled')
  .then(() => {
    console.log('then')
  })
  .catch(() => {
    console.log('catch')
  })
// 'then' 으로 출력됨

Promise.reject()

Promise.reject() -> 무조건 실패하는 promise로 바꿔줌,

Promise.reject('fulfilled')
  .then(() => {
    console.log('then')
  })
  .catch(() => {
    console.log('catch')
  })
// 'catch' 로 출력됨