Note 프로미스도 비동기 코드인데 이벤트 루프를 사용하나요?
네, 사용합니다. 프로미스가 resolve()나 reject()되는 순간 then()이나 catch()의 콜백 함수가 태스크 큐에 들어갑니다(여기서 이 콜백 함수를 프로미스 콜백 함수라고 하겠습니다). 호출 스택이 비면 이벤트 루프가 태스크 큐의 함수를 하나씩 호출 스택으로 보내는데, 이때 태스크 큐에 있는 프로미스 콜백 함수는 프로미스가 아닌 콜백 함수보다 먼저 호출 스택으로 올라갑니다. 프로미스 콜백 함수의 우선순위가 더 높다고 이해하면 됩니다.
다음 코드에서 setTimeout()이 호출된 후, resolve() 함수가 호출됩니다. resolve() 함수가 호출되었다는 것은 then()의 콜백 함수가 호출된다는 뜻입니다.
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('나는 나중에');
}, 0);
resolve();
});
promise.then(() => {
console.log('내가 먼저');
});
내가 먼저
나는 나중에