await 는 Promise 객체 앞에 선언되며반드시 async 함수 내에서만 사용할 수 있다. await 키워드가 호출되면 thread의 join 처럼 해당 작업이 끝나기 전까지 async의 메서드가 동작을 멈추고 기다린다. 또한 resolve의 파라미터가 Promise의 결과 값으로 활용된다. (아래의 예에서 await를 지우면 v1은 Promise 객체이고 await를 사용하면 init*10이다.)
async function mainfun(init) {
console.log(`초기 값: ${init}`);
let v1 = await new Promise((resolve, reject) => {
setTimeout(() => {
console.log(`비동기 작업 진행 1`);
resolve(init * 10);
}, 1000);
});
console.log(`처음 비동기 작업 종료.. ${v1}`);
let v2 = await new Promise((resolve, reject) => {
setTimeout(() => {
console.log(`비동기 작업 진행 2`);
resolve(v1 * 10);
}, 1000);
});
console.log(`두 번째 비동기 작업 종료 ${v2}`);
console.log("main fun end");
}
mainfun(5);
console.log("script over");
이제 두 번의 Promise를 호출하면서 별도의 then 문장이 없음에도 console에 순서대로 잘 출력됨을 확인할 수 있다.
resolve의 파라미터가 정상적인 동작의 반환이라면reject의 파라미터는 예외를 발생시키는 이유가 된다. 이 예외는try~catch 문장에서 처리할 수 있다.
다음 예는 arrow 함수에 async를 선언하고 이를 즉시 실행함수(괄호로 묶음)으로 만들어서 바로 실행하는 예이다.