javascript.info, https://ko.javascript.info/async-await
μ°Έκ³ μ¬μ΄νΈμ λ΄μ©μ κ°μΈμ μΌλ‘ 볡μ΅νκΈ° νΈνλλ‘ μ¬κ΅¬μ±ν κΈμ λλ€.
μμΈν μ€λͺ μ μ°Έκ³ μ¬μ΄νΈλ₯Ό μ΄ν΄λ³΄μκΈ° λ°λλλ€.
async
, await
ν€μλλ νλ‘λ―Έμ€λ₯Ό λ κ°λ
μ± μκ² ννν΄μ£ΌκΈ° μν΄ νμν λ¬Έλ²μ
λλ€.
async
ν€μλλ λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
async function f() {...};
const af = async () => {...};
async
ν€μλκ° λΆμ ν¨μλ λ°λμ νλ‘λ―Έμ€λ₯Ό λ°νν©λλ€.
async function f() {
return 1;
}
console.log(f());
>> Promise {<fulfilled>: 1}
await
ν€μλλ async
ν€μλκ° λΆμ ν¨μ μμμλ§ μλνλ©° λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
async function f() {
const promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("μλ£!"), 1000);
}
// μ΄ λΆλΆμμ νλ‘λ―Έμ€κ° μ΄νλ λκΉμ§ κΈ°λ€λ¦½λλ€.
const result = await promise;
console.log(result); // "μλ£"
}
ν¨μλ₯Ό νΈμΆνκ³ , ν¨μ λ³Έλ¬Έμ΄ μ€νλλ λμ€μ await
ν€μλλ₯Ό κ°μ§ μ€μμ μ€νμ΄ μ μ μ€λ¨λμλ€κ° νλ‘λ―Έμ€κ° μ²λ¦¬λλ©΄ μ€νμ΄ μ¬κ°λ©λλ€. μ΄λ νλΌλ―Έμ€ κ°μ²΄μ result κ°μ΄ λ³μ resultμ ν λΉλ©λλ€. λ°λΌμ μ μμλ₯Ό μ€ννλ©΄ 1μ΄ λ€μ 'μλ£!'κ° μΆλ ₯λ©λλ€.
νλ‘λ―Έμ€κ° μ²λ¦¬λκΈΈ κΈ°λ€λ¦¬λ λμμ μμ§μ΄ λ€λ₯Έ μΌ(λ€λ₯Έ μ€ν¬λ¦½νΈλ₯Ό μ€ν, μ΄λ²€νΈ μ²λ¦¬ λ±)μ ν μ μκΈ° λλ¬Έμ, CPU 리μμ€κ° λλΉλμ§ μμ΅λλ€.
νλ‘λ―Έμ€κ° μ μμ μΌλ‘ μ΄νλλ©΄ await promise
λ νλ‘λ―Έμ€ κ°μ²΄μ result
μ μ μ₯λ κ°μ λ°νν©λλ€. λ°λ©΄ νλΌλ―Έμ€κ° κ±°λΆλλ©΄ λ§μΉ throw
λ¬Έμ μμ±ν κ²μ²λΌ μλ¬κ° λμ Έμ§λλ€.
async function f() {
await Promise.reject(new Error("μλ¬ λ°μ!"));
}
μ μ½λλ μλ μ½λμ λμΌν©λλ€.
async function f() {
throw new Error("μλ¬ λ°μ!");
}
await
κ° λμ§ μλ¬λ throw
κ° λμ§ μλ¬λ₯Ό μ‘μ λμ²λΌ try..catch
λ₯Ό μ¬μ©ν΄ μ‘μ μ μμ΅λλ€.
async function f() {
try {
const response = await fetch('http://μ ν¨νμ§-μμ-μ£Όμ');
} catch(err) {
console.log(err); // TypeError: failed to fetch
}
}
f();
μλ¬κ° λ°μνλ©΄ μ μ΄ νλ¦μ΄ catch
λΈλ‘μΌλ‘ λμ΄κ°λλ€. μ¬λ¬ μ€μ μ½λλ₯Ό try
λ‘ κ°μΈλ κ²λ κ°λ₯ν©λλ€.
async function f() {
try {
const response = await fetch('http://μ ν¨νμ§-μμ-url');
const user = await response.json();
} catch(err) {
// fetchμ response.jsonμμ λ°νν μλ¬ λͺ¨λλ₯Ό μ¬κΈ°μ μ‘μ΅λλ€.
console.log(err);
}
}
f();
try..catch
κ° μμΌλ©΄ μλ μμμ async
ν¨μ f()
λ₯Ό νΈμΆν΄ λ§λ νλ‘λ―Έμ€κ° κ±°λΆ μνκ° λ©λλ€. f()
μ .catch
λ₯Ό μΆκ°νλ©΄ κ±°λΆλ νλ‘λ―Έμ€λ₯Ό μ²λ¦¬ν μ μμ΅λλ€.
async function f() {
const response = await fetch('http://μ ν¨νμ§-μμ-url');
}
// f()λ κ±°λΆ μνμ νλΌλ―Έμ€κ° λ©λλ€.
f().catch(alert); // TypeError: failed to fetch // (*)
ν¨μμ async
ν€μλλ₯Ό μΆκ°νλ©΄ λ κ°μ§ ν¨κ³Όκ° μμ΅λλ€.
ν¨μλ μΈμ λ νλΌλ―Έμ€λ₯Ό λ°νν©λλ€.
ν¨μ μμμ await
ν€μλλ₯Ό μ¬μ©ν μ μμ΅λλ€.
νλ‘λ―Έμ€ μμ await
ν€μλλ₯Ό λΆμ΄λ©΄ μλ°μ€ν¬λ¦½νΈλ νλ‘λ―Έμ€κ° μ²λ¦¬λ λκΉμ§ λκΈ°ν©λλ€. μ²λ¦¬κ° μλ£λλ©΄ 쑰건μ λ°λΌ μλμ κ°μ λμμ΄ μ΄μ΄μ§λλ€.
μλ¬ λ°μ β μμΈκ° μμ±λ¨(μλ¬κ° λ°μν μ₯μμμ throw errorλ₯Ό νΈμΆν κ²κ³Ό λμΌν¨)
μλ¬ λ―Έλ°μ β νλΌλ―Έμ€ κ°μ²΄μ result κ°μ λ°ν
async
, await
ν€μλλ₯Ό ν¨κ» μ¬μ©νλ©΄ μ½κ³ , μ°κΈ° μ¬μ΄ λΉλκΈ° μ½λλ₯Ό μμ±ν μ μμ΅λλ€.