Contents

Promise에 λŒ€ν•˜μ—¬

   Jul 20, 2023     2 min read

ν”„λ‘œλ―ΈμŠ€μ— λŒ€ν•΄ μ•Œμ•„λ³Έ κΈ€μž…λ‹ˆλ‹€.

μ΄λ²ˆμ— μ½”λ“œ λ¦¬νŒ©ν† λ§μ„ μ§„ν–‰ν•˜λ©° Promise 객체에 λŒ€ν•΄ μ•Œμ•„λ³Ό 수 μžˆλŠ” μ‹œκ°„μ΄ μƒκ²ΌμŠ΅λ‹ˆλ‹€. κ·Έ μ€‘μ—μ„œλ„ 특히 thenμ΄λΌλŠ” λ©”μ„œλ“œκ°€ μ’‹μ•˜λŠ”λ° κ·Έ κ²½ν—˜μ„ κ³΅μœ ν•˜κ³ μž ν•©λ‹ˆλ‹€.

μš°λ¦¬λŠ” μ’…μ’… Promise객체에 executor 비동기 ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 동기 μ†μ—μ„œ 비동기적 μˆ˜ν–‰μ΄ ν•„μš”ν•  λ•Œκ°€ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ ESLintμ—μ„œ μΆ”μ²œν•œλŒ€λ‘œ 섀정을 μ§€μ •ν•œλ‹€λ©΄ 문법상 였λ₯˜λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. ESLint κ·œμΉ™μΈ no-async-promise-executor에 따라 Promise executor ν•¨μˆ˜λŠ” 비동기 ν•¨μˆ˜(async ν•¨μˆ˜)둜 μ •μ˜ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ μ™œ Promise executor ν•¨μˆ˜μ— async ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλ κΉŒμš”?

μ™œ μ•ˆλ κΉŒ?

μ•ˆνƒ€κΉκ²Œλ„ Promise executor ν•¨μˆ˜ λ‚΄μ—μ„œ await ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것은 μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ Promise executor ν•¨μˆ˜λŠ” 동기적인 λ™μž‘μ„ μˆ˜ν–‰ν•΄μ•Ό ν•˜λ©°, await ν‚€μ›Œλ“œλŠ” 비동기 ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 즉, async ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•”λ¬΅μ μœΌλ‘œ Promiseλ₯Ό λ°˜ν™˜ν•˜λŠ” 비동기 ν•¨μˆ˜κ°€ λ˜μ–΄ 예기치 μ•Šμ€ λ™μž‘μ„ μ΄ˆλž˜ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ μš°λ¦¬κ°€ μ›ν•˜λŠ” λ™μž‘λŒ€λ‘œ 동기적 μˆ˜ν–‰μ„ ν•˜λŠ” Promise 객체 μ•ˆμ—μ„œ 비동기적 μˆ˜ν–‰μ„ ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법은 μ—†μ„κΉŒμš”??

κ²°λ‘ λΆ€ν„° λ§μ”€λ“œλ¦¬μžλ©΄ μžˆμŠ΅λ‹ˆλ‹€! λ°”λ‘œ Promise κ°μ²΄μ—μ„œ β€˜then’ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

then λ©”μ„œλ“œλŠ” λ¬΄μ—‡μΌκΉŒ?

then λ©”μ„œλ“œλŠ” Promise κ°μ²΄μ—μ„œ μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œ 쀑 ν•˜λ‚˜λ‘œ, Promiseκ°€ μ„±κ³΅μ μœΌλ‘œ 이행될 경우 μ‹€ν–‰ν•  콜백 ν•¨μˆ˜λ₯Ό λ“±λ‘ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. Promiseκ°€ 이행될 λ•Œ ν•΄λ‹Ή 콜백 ν•¨μˆ˜κ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.

then λ©”μ„œλ“œ μ‚¬μš© μ˜ˆμ‹œ

promise.then(onFulfilled, onRejected);

μ—¬κΈ°μ„œ promise은 Promise 객체이고, onFulfilledλŠ” Promiseκ°€ μ„±κ³΅μ μœΌλ‘œ 이행될 λ•Œ μ‹€ν–‰ν•  콜백 ν•¨μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. onRejectedλŠ” Promiseκ°€ 거뢀될 λ•Œ μ‹€ν–‰ν•  콜백 ν•¨μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

μΆ”κ°€ μ˜ˆμ‹œ

fetch("https://api.example.com/data")
  .then((response) => response.json()) // 첫 번째 비동기 μž‘μ—… 처리
  .then((data) => {
    // 이전 μž‘μ—…μ˜ κ²°κ³Ό(data)λ₯Ό 기반으둜 μΆ”κ°€ μž‘μ—… μˆ˜ν–‰
    console.log(data);
    return someAsyncFunction(data);
  })
  .then((result) => {
    // 이전 μž‘μ—…μ˜ κ²°κ³Ό(result)λ₯Ό 기반으둜 μΆ”κ°€ μž‘μ—… μˆ˜ν–‰
    console.log(result);
  })
  .catch((error) => {
    // μ—λŸ¬ 처리
    console.error(error);
  });

μœ„μ˜ μ˜ˆμ œμ—μ„œ fetch ν•¨μˆ˜λŠ” λΉ„λ™κΈ°μ μœΌλ‘œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” Promiseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 첫 번째 then λ©”μ„œλ“œμ—μ„œλŠ” μ„œλ²„ 응닡을 JSON으둜 λ³€ν™˜ν•©λ‹ˆλ‹€. 그리고 λ‹€μŒ then λ©”μ„œλ“œμ—μ„œλŠ” λ³€ν™˜λœ 데이터λ₯Ό 기반으둜 μΆ”κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ catch λ©”μ„œλ“œμ—μ„œλŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•œ 경우 μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€.

then λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 비동기 μž‘μ—…μ„ 순차적으둜 μ—°κ²°ν•˜κ³  κ²°κ³Όλ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ 

  • then λ©”μ„œλ“œλŠ” 체인 ν˜•νƒœλ‘œ μ‚¬μš©λ  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 즉, then λ©”μ„œλ“œλ₯Ό μ—°μ†μ μœΌλ‘œ ν˜ΈμΆœν•˜μ—¬ μ—¬λŸ¬ 개의 비동기 μž‘μ—…μ„ 순차적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 체인 ν˜•νƒœλ‘œ μ‚¬μš©ν•  경우, 각 then λ©”μ„œλ“œμ—μ„œ λ°˜ν™˜λœ Promise 객체λ₯Ό 톡해 λ‹€μŒ then λ©”μ„œλ“œμ— κ²°κ³Όλ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • Promise 객체 μžμ²΄λŠ” 비동기적인 νŠΉμ„±μ„ κ°€μ§€λ˜, κΈ€μ—μ„œ λ‚˜μ˜€λŠ” Promise executor ν•¨μˆ˜λŠ” λ™κΈ°μ μœΌλ‘œ λ™μž‘λ©λ‹ˆλ‹€.