-
[JS] async, await 함수JS & TS 2022. 7. 8. 17:54
async 함수는 비동기 작업을 한다.
new Promise를 리턴하던 함수를 조금씩 수정하면 async함수로 변환이 가능하다.
- 함수에 async 키워드를 붙인다.
- new Promise 리턴을 없애고 executor 내용만 남긴다.
- resolve(value); 부분을 return value;로 변경한다.
- rejuect(new Error()); 부분을 throw new Error(...);로 수정한다.
function startAsync(age) { return new Promise((resolve, reject) => { if (age > 20) resolve('${age}'); else reject(new Error('error')); }); } async function startAsync(age) { if (age > 20) return '${age}'; else throw new Error(error); }
이런식으로 바꿀 수 있다.
기존 함수를 async 함수로 바꾸면서 알 수 있는 내용은 async함수는 promise객체 자체를 리턴한다라는 것이다. 때문에 일반함수와 사용법을 달리해야만 한다. 이 불편함을 줄이기 위해 나온 문법이 await다.
function setTimeoutPromise(ms) { return new Promise((resolve, reject) => { setTimeout(() => resolve(), ms); }); } async function startAsync(age) { if (age > 20) return '${age}'; else throw new Error('${age}'); } async function startAsyncJobs() { await setTimeoutPromise(1000); const pms1 = startAsync(25); try { const value = await pms1; console.log(value); } catch (e) { console.error(e); } const pms2 = startAsync(15); try { const value = await pms2; console.log(value); } catch (e) { console.error(e); } } startAsyncJobs();
await의 특징은 이렇다.
1. 문법적으로 await p[[Promise 객체]] 이렇게 사용한다.
2. await은 Promise가 완료될 때까지 기다린다.(동기식)
3. await은 resolve를 리턴한다. reject가 발생하는 건에 대해선 예외를 발생시킨다. 때문에 기존의 async함수를 쓰는것과 다르게 await을 쓸 때는 try catch를 써야한다.
'JS & TS' 카테고리의 다른 글
[JS] Promise (0) 2022.07.08 [JS] 화살표 함수 (0) 2022.06.28 [JS] 객체 리터럴 (0) 2022.06.28 [JS] 이벤트 기반의 js, 이벤트 루프 (0) 2022.06.28