Node.js 교과서
책을 보던 중 '이벤트 루프'에 관련된 이야기나 나왔다.
javascript에 자신감이 있던 나는 문제를 머리속을 그려보고 정답을 찾았지만, 막상 컴퓨터로 돌아간 내용을 확인하니 내가 생각했던 것과는 다르게 되는 것을 보고 다시 한 번 이 부분에 대해 정확하게 공부를 하기로 마음을 먹었다.
이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할
setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳으로 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 됩니다.
여기서 자바스크립트가 아닌 다른 언어
가 중요한 포인트이다
이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보냅니다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부릅니다.
코랩ㄱ들은 보통 완료된 순서대로 줄을서 있지만, 특정한 경우에는 순서가 바뀌기도 합니다.
<script>
function run(){
console.log('3초 후 실행')
}
console.log('시작')
setTimeout(run, 3000);
console.log('끝')
</script>
시작
끝
3초 후 실행
스택
: anomymous
가 쌓임스택
: console.log('시작') 쌓임출력
: console.log('시작') 출력스택
: anomymous
가 사라짐 (파일을 다 실행해서)스택
: setTimeout
쌓임백그라운드
: 스택
에서 백그라운드
로 setTimeout
이동( 타이머 run 3000초로 이동)스택
: console.log('끝') 쌓임출력
: console.log('끝') 출력태스크 큐
: 백그라운드
에서 태스크 큐
으로 setTimeout
이동스택
: 스택
이 비어서 setTimeout
이 태스크 큐
에서 스택
으로 이동 및 출력
시작
끝
3초 후 실행
생각한 대로 출력이 된 것을 볼 수 있었다.
<script>
function oneMore(){
console.log('one more')
}
function run(){
console.log('run run');
setTimeout(() =>{
console.log('wow')
}, 0) // 0초여도 백그라운드를 가야된다.
new Promise((resolve) => {
resolve('hi'); // Promise의 내부는 동기
})
.then(console.log); // Promise가 then을 만나는 순간 비동기가 된다.
oneMore();
}
setTimeout(run, 5000);
</script>
run run
one more
wow
hi
run run
one more
h1
wow
setTimeout
보다 Promise
의 then
이 setTimeout
보다 우선순위가 높다.then
에 있는 'hi'가 먼저 출력된다.