ES7에 추가된 가장 최신 비동기 처리 패턴. 프로미스의 단점을 보완하고 가독성 좋은 코드를 작성할 수 있다!
async function helloAsync(){
return "hello Async!";
}
helloAsync().then((res)=>{console.log(res)});
// output : hello Async!
function delay(ms){
return new Promise((resolve)=>{
setTimeOut(()=>{
resolve();
},ms)
})
}
// 이때 셋타임아웃 안 콜백함수 안에 resolve 호출 밖에 없으면
// 콜백 자체를 resolve 함수로 받아도 상관 없음
function delay(ms){
return new Promise((resolve)=>{
setTimeOut(resolve,ms);
})
}
// 3초 딜레이 후에 helloAsync를 호출하고 싶을 때
async function helloAsync(){
await delay(3000);
return "hello async!";
}
async function main(){
const res = await helloAsync()
console.log(res);
}
main();
// output : 3초 뒤 hello Async! 출력



자바스크립트 엔진은 단순히 작업이 요청되면 콜스택을 이용해 순차적으로 실행할 뿐이다. 동시에 처리되는 것처럼 보이게 하는 비동기 요청 처리는 자바스크립트를 구동하는 브라우저가 담당한다.

setTimeOut과 같은 함수를 처리하는 순간 함수는 콜스택에서 빠져나오고 웹API에서 카운트를 시작한다. 카운트가 끝나면, 셋타임아웃은 제거가 되고 웹APIs는 셋타임아웃 함수 안에 있던 콜백함수를 Callback queue(또는 태스크큐)로 옮겨놓는다.
여기서 등장하는 이벤트루프🙋♀️. 이벤트루프는 루프를 돌며 콜스택 내부에 실행중인 task가 있는지, 그리고 태스크큐에 task가 있는지를 반복적으로 확인한다. 콜스택이 함수 처리를 끝내고 안이 비게 되면, 태스크큐 안의 함수를 콜스택 내부로 옮기고 함수가 실행된다.
만약 태스크큐 안에 태스크가 여러 개 있을 경우, 가장 앞에서 대기하고 있는 태스크를 한 번에 하나씩 콜스택으로 옮겨서 실행한다.

비동기처리는 어렵다.. 프로미스, async, await 개념은 여러 문서 보면서 조금 더 파봐야겠음ㅠㅠ