async await는 비동기 프로그래밍을 동기 프로그래밍처럼 작성할 수 있도록 함수에 추가된 기능이다. ES2017에서 자바스크립트 표준이 되었으며, async await를 이용해서 코드를 작성하면 가독성이 좋아진다.
async await는 비동기 상태를 값으로 다룰 수 없기 때문에 프로미스를 완전히 대체하는 것은 아니다!
async function getData() {
return 123;
}
async function getData() {
return Promise.resolve(123);
}
async function getData() {
throw new Error(123);
}
function requestData(value) {
return new Promise(resolve =>
setTimeout(() => {
resolve(value);
}, 1000),
);
}
async function getData() {
const data1 = await requestData(10);
console.log(data1);
const data2 = await requestData(20);
console.log(data2);
}
getData();
// 10 (1초 뒤)
// 20 (2초 뒤)
의존성이 높은 코드에서 가독성 비교
// promise
function getDataPromise() {
return asyncFunc1()
.then(data1 => Promise.all([data1, asyncFunc2(data1)])
.then(([data1, data2]) => {
return asyncFunc3(data1, data2);
});
}
// async await
async function getDataAsync() {
const data1 = await asyncFunc1();
const data2 = await asyncFunc2(data1);
return asyncFunc3(data1, data2);
}
// 순차적으로 실행되는 비동기 코드
async function getData() {
const data1 = await asyncFunc1();
const data2 = await asyncFunc2();
}
// await 키워드를 나중에 사용하면 병렬 실행할 수 있다
async function getData() {
const p1 = asyncFunc1();
const p2 = asyncFunc2();
const data1 = await p1;
const data2 = await p2;
}
// Promise.all을 이용해서 병렬로 실행하기
async function getData() {
const [data1, data2] = await Promise.all([asyncFunc1(), asyncFunc2()]);
}
// ThenableExample 클래스는 then 메소드를 갖고 있으므로
// 생성된 객체는 Thenable이다.
class ThenableExample {
then(resolve, reject) {
setTimeout(() => resolve(123), 1000);
}
}
async function asyncFunc() {
const result = await new ThenableExample();
console.log(result); // 123
}