자바스크립트 엔진은 멀티 스레드로 구동하는 다른 언어와는 달리 싱글 스레드로 구동된다. 이 부분에서 한가지 문제가 발생하는데 setTimeout이나 웹 호출 상황에서 작업이 완성될때까지 Call Stack에 쌓인 일들이 멈춰 버린다.
Call Stack에 쌓였다가 실행되어야 하는 비동기 함수는 브라우저에서 제공하는 Web API를 호출하고 Web API가 비동기 함수의 콜백 함수를 Callback Queue에 넣는다.
WebAPI로는 DOM(document), AJAX(XMLHttpRequest), setTimeout이 있다.
console.log('first');
setTimeout(function cb() {
console.log('third');
}, 5000);
console.log('second');
Call Stack
|log('first') |
|setTimeout. |
|log('second')|
Call Stack
| |
| |
| |
스크립트 실행하면서 Call Stack에 작업을 쌓아둠
LIFO 형태로 코드 실행
실행중 비동기 함수를 만나게 되면 webAPI를 호출
webAPI는 비동기 함수 형태에 따라 각각의 Queue에 작업을 넣어줌
Event Loop가 Call Stack을 보고 비어있다면 Microtask, Animation, Task 의 순서로 콜백 함수를 Call Stack에 올리고 처리
"어쨌든 이벤트 루프는 무엇입니까?"
MDN Event Loop
자바스크립트 비동기 처리 과정과 RxJS Scheduler