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' 로 출력됨