(880~885)
제너레이터의 단점: 코드가 장황해지고 가독성이 나빠졌다
ES8에서 더 간단하고 가독성 좋게 비동기처리를 할 수 있는 async/await 도입
async/await도 프로미스를 기반으로 동작하지만, 후속처리 메서드(then/catch/finally)필요 없이 동기 처리처럼 프로미스 결과를 반환할 수 있다.
async함수 안에서 await를 사용하면 settled상태가 될 때까지 대기하므로, 연달아 각각의 await를 사용하면 앞에서 작성한 await가 완료되기 전까지 다음의 await를 실행할 수 없다. 따라서 await가 순차적으로 완료될 필요가 없는 상황에서는 Promise.all()로 묶어서 처리하는 게 좋다
async function foo() {
const a = await new Promise(resolve => setTimeout(() => resolve(1), 3000));
const b = await new Promise(resolve => setTimeout(() => resolve(2), 2000));
const c = await new Promise(resolve => setTimeout(() => resolve(3), 1000));
}
foo(); //약 6초 소요
async function foo() {
const res = await Promise.all([
new Promise(resolve => setTimeout(() => resolve(1), 3000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 1000))
]);
}
foo(); //약 3초 소요
반대로 앞선 비동기 처리의 결과를 가지고 다음 비동기 처리를 수행해야하는 경우, 비동기 처리의 순서가 보장되어야 하므로 모든 프로미스에 await를 붙여서 순차적으로 처리해야 한다.
try {
setTimeout(() => { throw new Error('Error'); }, 1000);
} catch (e) {
// 에러를 캐치하지 못함
console.error('캐치한 에러', e);
}
Promise.all()
=> 잘 써보지 않았는데 기억하자