Section 17: Asynchronous Code - Code That "Takes a Bit Longer"
The goals
πͺπ»What is "Async Code"?
βπ»Working with Callbacks
ππ»Promises
ππ»async / await
quiz
λκΈ° μ½λμ λΉλκΈ° μ½λμ μ°¨μ΄λ 무μμΌκΉμ?
-
λκΈ° μ½λλ ν λ¨μλ‘ μ€νλκ³ λΉλκΈ° μ½λλ μΌλΆ μμ (μ: νμ΄λ¨Έ)μ΄ μλ£λλ©΄ μ€νλ©λλ€.
-
λκΈ° μ½λλ λΉλκΈ° μ½λ(μ: νμ΄λ¨Έ)κ° λ°κ²¬λ λκΉμ§ μ€νλκ³ μ΄ κ²½μ° ν΄λΉ μ½λκ° μ€νμ΄ μλ£λ λκΉμ§ μ€νμ΄ μΌμ μ€μ§λ©λλ€.
-
λ μ¬μ΄μλ μ°¨μ΄κ° μμ΅λλ€.
μ΄ μ½λλ μ½μμ 무μμ μΆλ ₯ν κΉμ?
console.log('Starting!);
setTimeout(() => {
console.log('Timer completed!');
}, 10);
console.log('Finished!');
-
- Starting!
- Timer completed!
- Finished!
-
- Starting!
- Finished!
- Timer completed!
-
μΆλ ₯ μμκ° νμ κ°μ κ²μ μλλλ€ - CPUμ μ¬λ¬ λ€λ₯Έ μμΈμ λ°λΌ λ¬λΌμ§λλ€.
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.
μ¬λ¬λΆμ λ€μν νλ‘λ―Έμ€ μνμ λν΄ λ°°μ μ΅λλ€.
- 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
JavaScriptμμ νλ‘λ―Έμ€λ 무μμΌκΉμ?
-
νλ‘λ―Έμ€λ JavaScriptμμ λΉλκΈ° μ½λλ₯Ό μλμν€λ μ μΌν λ°©λ²μ λλ€.
-
νλ‘λ―Έμ€λ μμ μ λ μ½κ² νκΈ° μν΄ (λΉλκΈ°) μ½λλ₯Ό "κ°μΈλ" κ°μ²΄μ λλ€.
-
νλ‘λ―Έμ€λ Http μμ²μ λ°±μλ μλ²λ‘ 보λ΄κ³ μλ΅μΌλ‘ μμ ν μ μλλ‘ ν©λλ€.
λ§μ λΉλκΈ° μμ μ κ²½μ° μ½λ°±μΌλ‘ μμ ν μλ μμ§λ§ νλ‘λ―Έμ€λ₯Ό μ¬μ©νλ©΄ λΉλκΈ° μ½λλ‘ μμ νκΈ°κ° λ μ½μ΅λλ€.
νλ‘λ―Έμ€μ λ§₯λ½μμ “μ²΄μ΄λ(Chaining)”μ΄λ 무μμΌκΉμ?
-
κ° then() λΈλ‘μ΄ μ νλ‘λ―Έμ€λ₯Ό λ°νν μ μμΌλ―λ‘(λ°νν νμλ μμ) μ¬λ¬ νλ‘λ―Έμ€λ₯Ό μλ‘ μ°κ²°ν μ μμ΅λλ€.
-
μ΄λ νλ‘λ―Έμ€ λ΄μμ λ€μν λ°°μ΄ λ©μλ(filter() λ±)λ₯Ό μ¬μ©ν μ μμμ μλ―Έν©λλ€.
-
κ° then()κ³Ό catch() λ©μλλ μμ§ SETTLED λμ΄μΌ νλ μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°ννκΈ° λλ¬Έμ then()κ³Ό catch() λ©μλλ₯Ό μλ‘μ μ°κ²°ν μ μμ΅λλ€.
μ€λ΅μ λλ€. λ€μ μλνμΈμ.
return λ¬Έμ μΆκ°νμ§ μλλΌλ then()κ³Ό catch()λ νμ μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό μμ±ν©λλ€.
μλ μμμ λ§μ§λ§ 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()λ λν μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°νν©λλ€.
async/ awaitκ³Ό νλ‘λ―Έμ€μ μ°¨μ΄μ μ 무μμΈκ°μ?
-
async/ awaitλ λΉλκΈ° μ½λλ₯Ό μ²λ¦¬μ λν΄μλ μμ ν λ€λ₯Έ μ κ·Ό λ°©μμ΄κ³ νλ‘λ―Έμ€μ μ ν κ΄λ ¨μ΄ μμ΅λλ€.
-
async/ awaitλ₯Ό μ¬μ©νλ©΄ λΉλκΈ° μ½λλ₯Ό λκΈ° μ½λλ‘ μ νν μ μμ΅λλ€.
-
async/ awaitλ κ²°κ΅ λ°±κ·ΈλΌμ΄λμμ μ¬μ ν νλ‘λ―Έμ€λ₯Ό μ¬μ©νλ μ½λ λ³νμ λλ€.
μλμ μ½λμ λμΌν νλ‘λ―Έμ€λ 무μμΌκΉμ?
async function wait() {
try {
const result = await doSomething();
console.log(result);
} catch (error) {
console.log('Error!');
}
}
-
- function wait() {
- doSomething()
- .catch(error => {
- console.log('Error!');
- })
- .then(result => {
- console.log(result);
- });
- }
-
- function wait() {
- doSomething()
- .then(result => {
- console.log(result);
- })
- .catch(error => {
- console.log('Error!');
- });
- }
-
- function wait() {
- doSomething()
- .then(result => {
- try {
- console.log(result);
- } catch (error) {
- console.log('Error!');
- }
- });
- }