JavaScript - The Complete Guide 2022

Section 17: Asynchronous Code - Code That "Takes a Bit Longer"

olivia_yj 2022. 11. 2. 20:08

The goals

πŸ’ͺ🏻What is "Async Code"?

✌🏻Working with Callbacks

πŸ‘πŸ»Promises

πŸ‘ŠπŸ»async / await

 

quiz

질문 1:

동기 μ½”λ“œμ™€ 비동기 μ½”λ“œμ˜ μ°¨μ΄λŠ” λ¬΄μ—‡μΌκΉŒμš”?

  • 동기 μ½”λ“œλŠ” ν–‰ λ‹¨μœ„λ‘œ μ‹€ν–‰λ˜κ³  비동기 μ½”λ“œλŠ” 일뢀 μž‘μ—…(예: 타이머)이 μ™„λ£Œλ˜λ©΄ μ‹€ν–‰λ©λ‹ˆλ‹€.

  • 동기 μ½”λ“œλŠ” 비동기 μ½”λ“œ(예: 타이머)κ°€ 발견될 λ•ŒκΉŒμ§€ μ‹€ν–‰λ˜κ³  이 경우 ν•΄λ‹Ή μ½”λ“œκ°€ 싀행이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ 싀행이 μΌμ‹œ μ€‘μ§€λ©λ‹ˆλ‹€.

  • λ‘˜ μ‚¬μ΄μ—λŠ” 차이가 μ—†μŠ΅λ‹ˆλ‹€.

질문 2:

이 μ½”λ“œλŠ” μ½˜μ†”μ— 무엇을 좜λ ₯ν• κΉŒμš”?

console.log('Starting!);
setTimeout(() => {
  console.log('Timer completed!');
}, 10);
console.log('Finished!');
    1. Starting!
    2. Timer completed!
    3. Finished!
    1. Starting!
    2. Finished!
    3. Timer completed!
  • 좜λ ₯ μˆœμ„œκ°€ 항상 같은 것은 μ•„λ‹™λ‹ˆλ‹€ - CPU와 μ—¬λŸ¬ λ‹€λ₯Έ μš”μΈμ— 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€.

질문 3:

JavaScriptλŠ” 비동기 μ½”λ“œ 싀행을 μ–΄λ–»κ²Œ μ²˜λ¦¬ν• κΉŒμš”?

  • 닀쀑 μŠ€λ ˆλ“œλ‘œ μ²˜λ¦¬ν•˜κ³  κΈ°λ³Έ 슀크립트 싀행이 μ°¨λ‹¨λ˜μ§€ μ•Šλ„λ‘ 더 였래 κ±Έλ¦¬λŠ” μž‘μ—…(예: 타이머)을 λ³„λ„μ˜ μŠ€λ ˆλ“œλ‘œ λ„˜κΉλ‹ˆλ‹€.

  • 단일 μŠ€λ ˆλ“œλ‘œ μ²˜λ¦¬ν•˜κ³  더 였래 κ±Έλ¦¬λŠ” μž‘μ—…(예: 타이머)이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ 슀크립트 싀행을 μ°¨λ‹¨ν•©λ‹ˆλ‹€.

  • 단일 μŠ€λ ˆλ“œμ΄μ§€λ§Œ 더 였래 κ±Έλ¦¬λŠ” μž‘μ—…(예: 타이머)을 (닀쀑 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ”) λΈŒλΌμš°μ €λ‘œ λ„˜κΉλ‹ˆλ‹€.

 

Instead of having multiple levels and that makes our code way more readable.

 

If we put catch in the middle of the promise code, then all prior then would be skipped.

 

ν”„λ‘œλ―ΈμŠ€ μƒνƒœ & “finally”

μ—¬λŸ¬λΆ„μ€ λ‹€μ–‘ν•œ ν”„λ‘œλ―ΈμŠ€ μƒνƒœμ— λŒ€ν•΄ λ°°μ› μŠ΅λ‹ˆλ‹€.

  • PENDING => ν”„λ‘œλ―ΈμŠ€κ°€ μž‘λ™ 쀑이며then()μ΄λ‚˜ catch() κ°€ μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€
  • RESOLVED =>  ν”„λ‘œλ―ΈμŠ€κ°€ ν•΄κ²°λμŠ΅λ‹ˆλ‹€ => then()이 μ‹€ν–‰λ©λ‹ˆλ‹€
  • REJECTED  => · ν”„λ‘œλ―ΈμŠ€κ°€ κ±°μ ˆλμŠ΅λ‹ˆλ‹€=> catch()이 μ‹€ν–‰λ©λ‹ˆλ‹€

catch()λ‚˜ then() λΈ”둝 λ‹€μŒμ— 또 λ‹€λ₯Έ then() λΈ”둝이 있으면 ν”„λ‘œλ―ΈμŠ€κ°€ PENDING λͺ¨λ“œλ‘œ λ‹€μ‹œ λ“€μ–΄κ°‘λ‹ˆλ‹€. (μ°Έκ³ : then()κ³Ό catch()λŠ” 항상 μƒˆλ‘œμš΄ ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€ - μ–΄λ–€ κ²ƒμœΌλ‘œλ„ ν•΄κ²°λ˜μ§€ μ•Šκ±°λ‚˜then()λ‚΄λΆ€μ—μ„œ returnν•œ κ²ƒμœΌλ‘œ ν•΄κ²°λ©λ‹ˆλ‹€). 더 이상 then() λΈ”둝이 남아 μžˆμ§€ μ•Šμ€ κ²½μš°μ—λ§Œ μ•„λž˜μ˜ μ΅œμ’… λͺ¨λ“œλ‘œ λ“€μ–΄κ°‘λ‹ˆλ‹€. SETTLED.

SETTLEDκ°€ 되면 특수 블둝인 finally()둜 μ΅œμ’… 정리 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이전에 해결됐든 거뢀됐든 상관없이 finally()μ—λŠ” λ„λ‹¬ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ μ˜ˆμ‹œμž…λ‹ˆλ‹€:

somePromiseCreatingCode()
  .then(firstResult => {
    return 'done with first promise';
  })
  .catch(err => {
    // would handle any errors thrown before
    // implicitly returns a new promise - just like then()
  })
  .finally(() => {
    // the promise is settled now - finally() will NOT return a new promise!
    // you can do final cleanup work here
  });

finally() λΈ”둝은 μΆ”κ°€ν•  ν•„μš” μ—†μŠ΅λ‹ˆλ‹€(κ°•μ˜μ—μ„œ ν•˜μ§€ μ•Šμ•˜μœΌλ‹ˆκΉŒμš”).

 

Promise

 

 

Promise.all / Promise.race

 

 

Async / Await

 

 

 

quiz

질문 1:

JavaScriptμ—μ„œ ν”„λ‘œλ―ΈμŠ€λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • ν”„λ‘œλ―ΈμŠ€λŠ” JavaScriptμ—μ„œ 비동기 μ½”λ“œλ₯Ό μž‘λ™μ‹œν‚€λŠ” μœ μΌν•œ λ°©λ²•μž…λ‹ˆλ‹€.

  • ν”„λ‘œλ―ΈμŠ€λŠ” μž‘μ—…μ„ 더 μ‰½κ²Œ ν•˜κΈ° μœ„ν•΄ (비동기) μ½”λ“œλ₯Ό "κ°μ‹ΈλŠ”" κ°μ²΄μž…λ‹ˆλ‹€.

  • ν”„λ‘œλ―ΈμŠ€λŠ” Http μš”μ²­μ„ λ°±μ—”λ“œ μ„œλ²„λ‘œ 보내고 μ‘λ‹΅μœΌλ‘œ μž‘μ—…ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

λ§Žμ€ 비동기 μž‘μ—…μ˜ 경우 콜백으둜 μž‘μ—…ν•  μˆ˜λ„ μžˆμ§€λ§Œ ν”„λ‘œλ―ΈμŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ 비동기 μ½”λ“œλ‘œ μž‘μ—…ν•˜κΈ°κ°€ 더 μ‰½μŠ΅λ‹ˆλ‹€.

 

질문 2:

ν”„λ‘œλ―ΈμŠ€μ˜ λ§₯λ½μ—μ„œ “체이닝(Chaining)”μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • 각 then() λΈ”둝이 μƒˆ ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•  수 μžˆμœΌλ―€λ‘œ(λ°˜ν™˜ν•  ν•„μš”λŠ” μ—†μŒ) μ—¬λŸ¬ ν”„λ‘œλ―ΈμŠ€λ₯Ό μ„œλ‘œ μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ΄λŠ” ν”„λ‘œλ―ΈμŠ€ λ‚΄μ—μ„œ λ‹€μ–‘ν•œ λ°°μ—΄ λ©”μ„œλ“œ(filter() λ“±)λ₯Ό μ‚¬μš©ν•  수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

  • 각 then()κ³Ό catch() λ©”μ„œλ“œλŠ” 아직 SETTLED λ˜μ–΄μ•Ό ν•˜λŠ” μƒˆλ‘œμš΄ ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— then()κ³Ό catch() λ©”μ„œλ“œλ₯Ό μ„œλ‘œμ— μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜€λ‹΅μž…λ‹ˆλ‹€. λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”.

μ™„μ „ν•˜κ²Œ μ˜³μ€ 닡은 μ•„λ‹™λ‹ˆλ‹€. then() 블둝은 아무 것도 λ°˜ν™˜ν•˜μ§€ μ•Šλ”λΌλ„ 항상 μƒˆλ‘œμš΄ ν”„λ‘œλ―ΈμŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 참고둜 catch() 블둝도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.

return 문을 μΆ”κ°€ν•˜μ§€ μ•Šλ”λΌλ„ then()κ³Ό catch()λŠ” 항상 μƒˆλ‘œμš΄ ν”„λ‘œλ―ΈμŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

 

질문 3:

μ•„λž˜ μ˜ˆμ—μ„œ λ§ˆμ§€λ§‰ then() λΈ”둝이 μ‹€ν–‰λ κΉŒμš”(즉 μ „λ‹¬λœ ν•¨μˆ˜κ°€ μ‹€ν–‰λ κΉŒμš”)?

const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Timer completed!');
  }, 1000);
})
  .then((text) => { throw new Error('Failed!') })
  .catch(err => console.log(err))
  .then(() => console.log('Does that execute?'));
  • κ·Έλ ‡μŠ΅λ‹ˆλ‹€!

  • μ•„λ‹ˆμ˜€, 이전에 였λ₯˜κ°€ λ°œμƒν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

  • μ•„λ‹ˆμ˜€, ν”„λ‘œλ―ΈμŠ€ 체인당 두 개 μ΄μƒμ˜ then()κ³Ό catch() λΈ”둝을 κ°€μ§ˆ 수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

then()κ³Ό catch() 블둝이 μ›ν•˜λŠ” 만큼 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

catch() 블둝을 톡해 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•œ μ΄ν›„μ—λŠ” then() 블둝이 μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€. catch()λŠ” λ˜ν•œ μƒˆλ‘œμš΄ ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

질문 4:

async/ awaitκ³Ό ν”„λ‘œλ―ΈμŠ€μ˜ 차이점은 λ¬΄μ—‡μΈκ°€μš”?

  • async/ awaitλŠ” 비동기 μ½”λ“œλ₯Ό μ²˜λ¦¬μ— λŒ€ν•΄μ„œλŠ” μ™„μ „νžˆ λ‹€λ₯Έ μ ‘κ·Ό 방식이고 ν”„λ‘œλ―ΈμŠ€μ™€ μ „ν˜€ 관련이 μ—†μŠ΅λ‹ˆλ‹€.

  • async/ awaitλ₯Ό μ‚¬μš©ν•˜λ©΄ 비동기 μ½”λ“œλ₯Ό 동기 μ½”λ“œλ‘œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • async/ awaitλŠ” κ²°κ΅­ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ—¬μ „νžˆ ν”„λ‘œλ―ΈμŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œ λ³€ν™˜μž…λ‹ˆλ‹€.

 

질문 5:

μ•„λž˜μ˜ μ½”λ“œμ™€ λ™μΌν•œ ν”„λ‘œλ―ΈμŠ€λŠ” λ¬΄μ—‡μΌκΉŒμš”?

async function wait() {
  try {
    const result = await doSomething();
    console.log(result);
  } catch (error) {
    console.log('Error!');
  }
}
    1. function wait() {
    2.   doSomething()
    3.     .catch(error => {
    4.       console.log('Error!');
    5.     })
    6.     .then(result => {
    7.       console.log(result);
    8.     });
    9. }
    1. function wait() {
    2.   doSomething()
    3.     .then(result => {
    4.       console.log(result);
    5.     })
    6.     .catch(error => {
    7.       console.log('Error!');
    8.     });
    9. }
    1. function wait() {
    2.   doSomething()
    3.     .then(result => {
    4.        try {
    5.           console.log(result);
    6.        } catch (error) {
    7.           console.log('Error!');
    8.        }
    9.    });
    10. }