JS async/await
Table of contents
async / await λ₯Ό μ¬μ©νλ©΄ νλ‘λ―Έμ€λ₯Ό λ νΈνκ² μ¬μ©ν μ μκ³ , κ°λ μ±μ΄ μ’μμ§λ€.
async
async
ν€μλλ function
ν€μλμ ν¨κ» async function
ν€μλλ‘ μ¬μ©νμ¬ AsyncFunction
κ°μ²΄λ₯Ό λ°ννλ νλμ λΉλκΈ° ν¨μλ₯Ό μ μνκ³ , μ묡μ μΌλ‘ Promise
λ₯Ό μ¬μ©νμ¬ κ²°κ³Όλ₯Ό λ°ννλ€.
// async function μ μΈasync function asyncFuncDeclare() {return /* ... */;}// async function ννμ (ES6 νμ΄ν ν¨μ λ¬Έλ²)const asyncFuncExpression = () => {return /* ... */;};
νμ Promiseλ₯Ό λ°ν νλ€
async
κ° λΆμ ν΄λΉ ν¨μλ νμ νλ‘λ―Έμ€λ₯Ό λ°ννκ³ , νλ‘λ―Έμ€κ° μλ κ°μ λ°ννλλΌλ μ΄ν μνμ νλΌλ―Έμ€(resolved promise)λ‘ κ°μ κ°μΈ μ΄νλ νλΌλ―Έμ€κ° λ°νλλλ‘ νλ€.
async function func() {return 1;}func().then(alert); // 1
λͺ μμ μΌλ‘ νλ‘λ―Έμ€λ₯Ό λ°ννλ κ²λ κ°λ₯ νμ§λ§ κ²°κ³Όλ λμΌνλ€.
async function func() {return Promise.resolve(1);}func().then(alert); // 1
await
await
ν€μλλ Promise
κ° μ²λ¦¬λ λκΉμ§ κΈ°λ€λ¦¬κΈ° μν΄ μ¬μ©νλ μ°μ°μλ€. async function
λ΄λΆμμλ§ μ¬μ©ν μ μκ³ , νλ‘λ―Έμ€κ° μ²λ¦¬λλ©΄ κ·Έ κ²°κ³Όμ ν¨κ» μ€νμ΄ μ¬κ°λλ€.
await
λ λ€μμ μ€λ λ¬Έμ κ°μ΄ νλ‘λ―Έμ€κ° μλλ©΄ ν΄λΉ κ°μ resolved Promiseλ‘ λ³νμν¨λ€.
Promise μ²λ¦¬λ₯Ό κΈ°λ€λ¦°λ€
await
λ₯Ό λ§λλ©΄ νλ‘λ―Έμ€κ° μ²λ¦¬(settled)λ λκΉμ§ κΈ°λ€λ¦¬κ³ κ²°κ³Όλ κ·Έ μ΄ν λ°νλλ€.
ν¨μλ₯Ό νΈμΆνκ³ , ν¨μ λ³Έλ¬Έμ΄ μ€νλλ λμ€μ μ€νμ΄ μ μ 'μ€λ¨βλμλ€κ° νλ‘λ―Έμ€κ° μ²λ¦¬λλ©΄ μ€νμ΄ μ¬κ°λλ€.
async function func() {let promise = new Promise((resolve, reject) => {setTimeout(() => resolve("μλ£!"), 1000)});let result = await promise; // νλΌλ―Έμ€κ° μ΄νλ λκΉμ§ κΈ°λ€λ¦Όalert(result); // "μλ£!"}func();
νλ‘λ―Έμ€ μ²λ¦¬κ° μ±κ³΅νλ©΄ await
λ fulfill λ ν΄λΉ κ°μ 리ν΄νκ³ , μ€ν¨νλ©΄ await
λ reject λ κ°μ throw
νλ€.
νλ‘λ―Έμ€κ° μ²λ¦¬λκΈΈ κΈ°λ€λ¦¬λ λμμ μμ§μ΄ λ€λ₯Έ μΌ(λ€λ₯Έ μ€ν¬λ¦½νΈλ₯Ό μ€ν, μ΄λ²€νΈ μ²λ¦¬ λ±)μ ν μ μμ΄ CPU 리μμ€ λλΉλ₯Ό μ€μΌ μ μλ€.
μλ¬ νΈλ€λ§
νλ‘λ―Έμ€κ° reject λλ©΄ throw
λ¬Έμ μμ±ν κ²μ²λΌ μλ¬κ° λμ Έμ§λ€.
async function func() {await Promise.reject(new Error("μλ¬ λ°μ!"));}
μμ μ½λλ μλμ μ½λμ λμΌνλ€.
async function func() {throw new Error("μλ¬ λ°μ!");}
νλ‘λ―Έμ€κ° reject λκΈ° μ μ μκ°μ΄ 걸리면μ await
κ° μλ¬λ₯Ό throw
νλ κ²μ λλ μ΄κ° λ°μνλ κ²½μ°, try..catch
λ₯Ό μ¬μ©ν μ μλ€.
async function func() {try {let response = await fetch('...');let data = await response.json();} catch(err) {// fetchμ response.jsonμμ λ°νν μλ¬ λͺ¨λλ₯Ό μ¬κΈ°μ μ‘λλ€.alert(err);}}func();
μλ¬κ° λ°μνλ©΄ μ μ΄ νλ¦μ΄ catch
λΈλ‘μΌλ‘ λμ΄κ°κ³ , μ¬λ¬ μ€μ μ½λλ₯Ό try
λ‘ κ°μΈλ κ²λ κ°λ₯νλ€.
.catch
λ§ μ¬μ©ν΄ async function
μΈλΆμμ reject λ νλ‘λ―Έμ€λ₯Ό μ²λ¦¬ν μλ μλ€.
async function func() {let response = await fetch('...');}func().catch(alert);
async/await μ promise.then/catch
async/await
μ μ¬μ©νλ©΄await
κ° λκΈ°λ₯Ό μ²λ¦¬ν΄μ£ΌκΈ° λλ¬Έμ.then
μ μ¬μ©ν μΌμ΄ κ±°μ μκ³ ,.catch
λμ μΌλ°try..catch
λ₯Ό μ¬μ©ν μ μλ€λ μ₯μ μ΄ μκΈ΄λ€. νμ§λ§async
ν¨μ λ°κΉ₯μ μ΅μμ λ 벨 μ½λμμawait
λ₯Ό μ¬μ©ν μ μκΈ° λλ¬Έμ μμ μ½λ μ²λΌ.then/catch
λ₯Ό μΆκ°ν΄ μ΅μ’ κ²°κ³Όλ μ²λ¦¬λμ§ λͺ»ν μλ¬λ₯Ό λ€λ£¬λ€.
μΌλ° ν¨μμλ awaitλ₯Ό μ¬μ©ν μ μλ€
μΌλ° ν¨μμμ await
μ μ¬μ©νλ©΄ λ¬Έλ² μλ¬κ° λ°μνλ€.
function func() {let promise = Promise.resolve(1);let result = await promise; // Syntax error}
μ΅μμ λ 벨 μ½λμμ μλνμ§ μλλ€
μ΅μμ λ 벨 μ½λ(top-level code)μμ await
λ μ¬μ©ν μ μλ€.
// μ΅μμ λ 벨 μ½λμμ λ¬Έλ² μλ¬κ° λ°μνλ€.let response = await fetch('...');let data = await response.json();
νμ§λ§ μ΅λͺ
async ν¨μλ‘ μ½λλ₯Ό κ°μΈλ©΄ μ΅μμ λ 벨 μ½λμλ await
λ₯Ό μ¬μ©ν μ μλ€.
(async () => {let response = await fetch('...');let data = await response.json();...})();
async ν΄λμ€ λ©μλ
λ©μλ μ΄λ¦ μμ async
λ₯Ό μΆκ°νλ©΄ async ν΄λμ€ λ©μλλ₯Ό μ μΈν μ μλ€.
class Waiter {async wait() {return await Promise.resolve(1);}}new Waiter().wait().then(alert); // 1
async
λ©μλμasync
ν¨μλ νλΌλ―Έμ€λ₯Ό λ°ννκ³await
λ₯Ό μ¬μ©ν μ μλ€λ μ μ΄ λμΌνλ€.
thenable κ°μ²΄λ₯Ό μ¬μ©ν μ μλ€
promise.then
μ²λΌ await
μλ thenable κ°μ²΄(then
λ©μλκ° μλ νΈμΆ κ°λ₯ν κ°μ²΄)λ₯Ό μ¬μ©ν μ μλ€. μλνν°μμ λ°μ κ°μ²΄κ° .then
μ μ§μνλ©΄ μ΄ κ°μ²΄λ₯Ό await
μ ν¨κ» μ¬μ©ν μ μλ€.
thenable κ°μ²΄
μλνν° κ°μ²΄κ° νλ‘λ―Έμ€κ° μλμ§λ§ νλ‘λ―Έμ€μ νΈν κ°λ₯ν κ°μ²΄λ₯Ό μ 곡ν μ μλ€λ μ μμ μκΈ΄ κΈ°λ₯
await
λ .then
μ΄ κ΅¬νλμ΄μμΌλ©΄μ νλΌλ―Έμ€κ° μλ κ°μ²΄λ₯Ό λ°μΌλ©΄, λ΄μ₯ ν¨μ resolve
μ reject
λ₯Ό μΈμλ‘ μ 곡νλ λ©μλμΈ .then
μ νΈμΆνλ€(μΌλ° Promise
executorκ° νλ μΌκ³Ό λμΌ).
μμ½
async
ν€μλλfunction
ν€μλμ ν¨κ» μ¬μ©νμ¬ async ν¨μλ₯Ό μ μνλ€.async
κ° λΆμ ν¨μλ λ°λμ νλ‘λ―Έμ€λ₯Ό λ°ννκ³ , νλ‘λ―Έμ€κ° μλ κ²½μ° νλ‘λ―Έμ€λ‘ κ°μΈ λ°ννλ€.await
λPromise
κ° μ²λ¦¬λ λκΉμ§ κΈ°λ€λ¦¬κΈ° μν΄ μ¬μ©νλ μ°μ°μλ€.async function
λ΄λΆμμ λ§await
λ₯Ό μ¬μ©ν μ μλ€.await
μ νλ‘λ―Έμ€κ° μ±κ³΅νλ©΄ νλΌλ―Έμ€ κ°μ²΄μ result κ°μ λ°ννκ³ , μλ¬κ° λ°μνλ©΄throw
νλ€.
ν μ€ μμ½
async / awaitλ νλ‘λ―Έμ€λ₯Ό κΈ°λ°μΌλ‘ νκ³ , λΉλκΈ° μ½λλ₯Ό μμ±νλ©΄μ μ΄ν΄νκΈ° μ½κ³ μ½κΈ° νΈνκ² λ§λ€μ΄ μ€λ€.
reference
async function ννμ - JavaScript | MDN
AsyncFunction - JavaScript | MDN