[JavaScript] ν”„λ‘œλ―ΈμŠ€μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž Promise
728x90

λ“€μ–΄κ°€λ©°

μ½œλ°±μ§€μ˜₯μ΄λΌλŠ” 것을 λ“€μ–΄λ³Έ 적이 μžˆλŠ”μ§€?

ES6이 λ„μž…λ˜κΈ° 이전에 비동기 μž‘μ—…μ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ½œλ°±ν•¨μˆ˜λ‘œ μ²˜λ¦¬ν–ˆλ‹€κ³  ν•œλ‹€.
비동기 μž‘μ—…μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” 일이 λ§Žμ•„μ§ˆμˆ˜λ‘ ν•¨μˆ˜κ°€ 점점 더 κΉŠμ–΄μ§€κ²Œ λ˜λŠ”λ°,
이λ₯Ό ν”νžˆλ“€ μ½œλ°±μ§€μ˜₯, 콜백 ν—¬ callback hell 이라고듀 λΆ€λ₯Έλ‹€.

이런 μ›ƒν”ˆ 지도 λŒμ•„λ‹€λ‹Œλ‹€. 좜처: https://imgur.com/FDzn5s0

μœ„μ˜ 지만 보아도 μ–Όλ§ˆλ‚˜ 가독성이 쒋지 μ•Šμ€μ§€...πŸ˜‡  연결을 νŒŒμ•…ν•˜κΈ°κ°€ 쉽지 μ•Šλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

이런 콜백 지μ˜₯을 ν”Όν•  수 μžˆλŠ” 방법이 λͺ‡κ°€μ§€ μžˆλŠ”λ°, 이 κΈ€μ—μ„œλŠ” ν”„λ‘œλ―ΈμŠ€ Promise에 λŒ€ν•΄ 써보고자 ν•œλ‹€.

 

 

ν”„λ‘œλ―ΈμŠ€

ν”„λ‘œλ―ΈμŠ€λŠ” ES6μ—μ„œ λ„μž…λœ 객체둜, 비동기 처리 μƒνƒœμ™€ 처리 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” 객체이닀.
비동기 처리λ₯Ό ν–ˆμ„ λ•Œ μž‘μ—…μ΄ 성곡이든, μ‹€νŒ¨μ΄λ“  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•΄μ€€λ‹€.
μ•„λž˜μ™€ 같은 ν˜•νƒœλ‘œ new μ—°μ‚°μžλ₯Ό 톡해 μ„ μ–Έν•  수 μžˆλ‹€.

const promise = new Promise((resolve, reject) => {
    // 비동기 처리 μˆ˜ν–‰

    if(μ²˜λ¦¬μ— μ„±κ³΅ν•˜λŠ” 쑰건){
        resolve('처리 성곡');    
    } else{
        reject('처리 μ‹€νŒ¨');
    }

});

 

인수둜 받은 비동기 처리λ₯Ό ν•˜μ—¬ ν”„λ‘œλ―ΈμŠ€μ˜ μƒνƒœμ— 따라 성곡할 λ•ŒλŠ” resolve, μ‹€νŒ¨ν•  λ•ŒλŠ” rejectλ₯Ό ν˜ΈμΆœν•œλ‹€.
ν”„λ‘œλ―ΈμŠ€μ˜ μƒνƒœλŠ” 비동기 처리의 진행여뢀λ₯Ό λ³΄μ—¬μ£ΌλŠ” 정보인데 μ•„λž˜μ²˜λŸΌ μ„Έ 가지 κ²½μš°κ°€ μžˆλ‹€.

 

ν”„λ‘œλ―ΈμŠ€μ˜ μƒνƒœ

  • Pending (λŒ€κΈ°) : 비동기 처리 μˆ˜ν–‰μ΄ 아직 λ˜μ§€μ•Šμ€ μƒνƒœ. ν”„λ‘œλ―ΈμŠ€μ˜ κΈ°λ³Έ μƒνƒœ.
  • Fulfiled (성곡) : 비동기 처리 μˆ˜ν–‰μ΄ μ„±κ³΅ν•œ μƒνƒœ. resolve ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.
  • rejected (μ‹€νŒ¨) : 비동기 처리 μˆ˜ν–‰μ΄ μ‹€νŒ¨ν•œ μƒνƒœ. reject ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.

비동기 μ²˜λ¦¬μ— λ”°λΌμ„œ ν”„λ‘œλ―ΈμŠ€μ˜ μƒνƒœκ°€ μ„±κ³΅ν•˜μ—¬ fufilledκ°€ λ˜μ—ˆλ‹€λ˜κ°€, μ‹€νŒ¨ν•˜μ—¬ rejectedκ°€ λ˜μ—ˆλ‹€λ©΄ ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.

ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ‘œ ν”„λ‘œλ―ΈμŠ€μ˜ μƒνƒœκ°€ κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— 이 ν•¨μˆ˜μ— λŒ€ν•œ μ²˜λ¦¬κ°€ ν•„μš”ν•˜λ‹€.

이 ν•¨μˆ˜κ°€ 비동기 μ²˜λ¦¬μ— λŒ€ν•œ ν›„μ†μ²˜λ¦¬λ₯Ό ν•œλ‹€λŠ” μ μ—μ„œ μ½œλ°±μ§€μ˜₯을 ν•΄κ²°ν•œλ‹€κ³  ν•  수 μžˆλ‹€.

이런 μ²˜λ¦¬μ—­ν• μ„ ν•˜λŠ” 후속 λ©”μ„œλ“œλ‘œλŠ” μ„Έ 가지가 μžˆλ‹€.

 

ν”„λ‘œλ―ΈμŠ€μ˜ 후속 λ©”μ„œλ“œ

  • .then() : ν”„λ‘œλ―ΈμŠ€κ°€ 성곡(fufilled)ν•œ μƒνƒœμΌ λ•Œ ν˜ΈμΆœλœλ‹€.
  • .catch() : ν”„λ‘œλ―ΈμŠ€κ°€ μ‹€νŒ¨(rejected)ν•œ μƒνƒœμΌλ•Œλ§Œ ν˜ΈμΆœλœλ‹€. μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œ.
  • .fianlly(): λ§ˆμ§€λ§‰μ— κ³΅ν†΅μœΌλ‘œ μ²˜λ¦¬ν•  λ‚΄μš©μ„ μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œ. ν•œ 번만 호좜될 수 μžˆλ‹€.

μœ„ μ„Έ λ©”μ„œλ“œλŠ” 항상 ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” 곡톡점이 μžˆλ‹€.
또 λ©”μ„œλ“œμ²΄μ΄λ‹μ„ 톡해 이전 처리의 값을 μ „λ‹¬λ°›μœΌλ©° μ—°μ†μ μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€.

 

 

ν”„λ‘œλ―ΈμŠ€μ˜ 처리 κ³Όμ •. 좜처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise

 

ν”„λ‘œλ―ΈμŠ€μ˜ 후속 λ©”μ„œλ“œ 체이닝 과정을 도식화 ν•˜λ©΄ μœ„μ™€ 같이 ν‘œν˜„λœλ‹€.

 

 

간단 μ˜ˆμ‹œ

λ©”μ„œλ“œ μ²΄μ΄λ‹μœΌλ‘œ ν”„λ‘œλ―ΈμŠ€λ₯Ό κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•΄λ³΄μ•˜λ‹€.

const printNumber = (num) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(num);
      num++;
      if (num <= 5) {
        resolve(num);
      } else {
        reject(`${num}은 5보닀 큰 수.`);
      }
    }, 2000);
  });
};

printNumber(3)
  .then((num) => {
    return printNumber(num);
  })
  .then((num) => {
    return printNumber(num);
  })
  .catch((rej) => console.log(rej))
  .finally(() => console.log('끝'));

λΈŒλΌμš°μ € μ½˜μ†”μ—μ„œ μ‹€ν–‰ν•˜λ©΄ μœ„μ™€ 같이 2μ΄ˆμ”© λ”œλ ˆμ΄λ˜λ©° κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€.

이제 ν”„λ‘œλ―ΈμŠ€λ‘œ μ½œλ°±μ§€μ˜₯μ—μ„œ λ²—μ–΄λ‚˜ μ’€ 더 λͺ…μ‹œμ μ΄κ³  κΉ”λ”ν•˜κ²Œ 비동기 처리λ₯Ό ν•΄λ³΄μž!~ 

728x90