λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ‘¨‍πŸ’» web.dev/js.ts

[JavaScript] Promise.all vs Promise.allSettled

by HandHand 2022. 2. 20.

Promise.all vs Promise.allSettled

πŸ“Œ Promise.all 을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ²½μš°λŠ”?

νšŒμ‚¬μ—μ„œ API 호좜 λ‘œμ§μ„ μž‘μ„±ν•˜λ‹€κ°€ 비동기 병렬 처리λ₯Ό μœ„ν•΄ λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μž‘μ„±ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

try {

    await Promise.all([
        fetchMySomeDataAsync(),
        fetchMyAnotherDataAsync(),
    ])

    // ...
} 

두 비동기 ν•¨μˆ˜λ₯Ό λ³‘λ ¬λ‘œ μ‹€ν–‰ν•˜κ³  싢을 λ•Œ μœ„ 처럼 μž‘μ„±ν•˜λŠ” 것이 λ§žμ„κΉŒμš”?

λ¬Έμ œλŠ” λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

 

A와 B λΌλŠ” ν•¨μˆ˜λ₯Ό λ³‘λ ¬λ‘œ μ‹€ν–‰ν•˜μ§€λ§Œ,

두 ν•¨μˆ˜ 각각의 성곡 및 μ‹€νŒ¨ μœ λ¬΄κ°€ μ„œλ‘œ 연관이 없을 경우

 

Promise.all 은 λ³‘λ ¬λ‘œ μ‹€ν–‰ν•œ ν•¨μˆ˜ 쀑 μ–΄λŠ ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•œλ‹€λ©΄ error 둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.

try {
    const promise1 = Promise.resolve(1);
    const promise2 = new Promise((resolve, reject) => {
      setTimeout(() => resolve("resolve"), 7000);
    });
    const promise3 = new Promise((resolve, reject) => {
      setTimeout(() => reject("reject"), 3000);
    });

    const response = await Promise.all([promise1, promise2, promise3]);
    console.log('성곡', response)
  } catch (err) {
    console.error('μ—λŸ¬', err)
  }

λ•Œλ¬Έμ— μ‹€μ œλ‘œ 병렬 μ²˜λ¦¬λ˜λŠ” ν•¨μˆ˜λ“€λΌλ¦¬ μ„œλ‘œ 연관이 μ—†λ‹€λ©΄, Promise.all 둜 λ¬ΆλŠ” 것은

κ°œλ°œμžκ°€ κΈ°λŒ€ν•œ κ²ƒκ³ΌλŠ” λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€.

λ”°λΌμ„œ Promise.all 은 λ‹€μŒκ³Ό 같은 κ²½μš°μ— μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

 

λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 μ„œλ‘œ μ—°κ΄€λœ 비동기 μž‘μ—…μ„ λͺ¨λ‘ μ΄ν–‰λ˜μ–΄μ•Ό 함을 보μž₯ν•΄μ•Όν•˜λŠ” 경우

 

πŸ“Œ Promise.allSettled 에 λŒ€ν•΄μ„œ

μ‹€μ œλ‘œ μ œκ°€ κΈ°λŒ€ν–ˆλ˜ λ™μž‘μ€ Promise.allSettled λ₯Ό 톡해 κ΅¬ν˜„ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ES2020 μ—μ„œ μƒˆλ‘­κ²Œ μΆ”κ°€λœ 이 비동기 처리 방식은 주둜

μ„œλ‘œμ˜ 성곡 여뢀와 관련이 μ—†λŠ” 비동기 μž‘μ—…λ“€μ„ λ³‘λ ¬λ‘œ μˆ˜ν–‰ ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

try {
    const promise1 = Promise.resolve(1);
    const promise2 = new Promise((resolve, reject) => {
      setTimeout(() => resolve("resolve"), 7000);
    });
    const promise3 = new Promise((resolve, reject) => {
      setTimeout(() => reject("reject"), 3000);
    });

    const response = await Promise.allSettled([promise1, promise2, promise3]);
    console.log('성곡', response)
  } catch (err) {
    console.error('μ—λŸ¬', err)
  }

allSettled λŠ” 각 비동기 ν˜ΈμΆœλ³„λ‘œ 응닡결과λ₯Ό 배열에 λ‹΄μ•„ λ°˜ν™˜λ°›μŠ΅λ‹ˆλ‹€.

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ response 둜 λ‹€μŒκ³Ό 같은 응닡 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

[
  { status: 'fulfilled', value: 1 },
  { status: 'fulfilled', value: 'resolve' },
  { status: 'rejected', reason: 'reject' }
]

status λ₯Ό 톡해 호좜의 성곡 유무λ₯Ό νŒλ‹¨ν•  수 있고

μ„±κ³΅μ‹œμ—λŠ” value , μ‹€νŒ¨μ‹œμ—λŠ” reason 으둜 μ–΄λ–»κ²Œ 이행 λ˜λŠ” κ±°λΆ€λ˜μ—ˆλŠ”μ§€ 확인이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

참고 자료

Promise.all() - JavaScript | MDN
Promise.allSettled() - JavaScript | MDN

λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€