Let’s see how the execution goes for this promise constructor.
new Promise((resolve) => {
setTimeout(() => resolve("Done!"), 100);
})
.then(result => console.log(result));
We have the promise constructor that has a setTimeout and we also have a then handler.
let’s just go through it step by step and see what’s happens.
First, the new Promise constructor is added to the Call Stack

이벤트 루프에는 크게 두 가지 계층이 있습니다:
MacroTask Queue (Task Queue) - 매크로 테스크큐
→ setTimeout, setInterval, setImmediate(Node 전용), I/O 콜백 등 큰 단위의 작업이 들어감.
→ 각 task 실행이 끝나면 이벤트 루프가 microtask들을 싹 비운 다음 다음 task로 넘어감.
MicroTask Queue - 마이크로 테스크큐
→ Promise.then/catch/finally, MutationObserver, queueMicrotask 등이 들어감.
→ 현재 실행 중인 Task가 끝나자마자 바로 실행됨.
→ 그래서 “microtask는 macro보다 우선 실행된다”라고 기억하면 됨.
NextTick Queue (Node.js 전용) - 넥스트틱 큐
→ process.nextTick()에서 들어감.
→ Microtask보다도 더 높은 우선순위.
→ 즉, Task 끝 → nextTick 먼저 싹 실행 → 그 다음에 Microtask → 그 다음 다음 Task.
| 구분 | Task Queue (MacroTask) | MicroTask Queue | NextTick Queue |
|---|---|---|---|
| 속성 | 큰 단위 작업, 주기적 실행 | 작은 단위 후처리, 즉각 실행 | Node.js 특수 큐, microtask보다 빠름 |
| 대표 예시 | setTimeout, setInterval, setImmediate(Node), I/O | Promise.then, queueMicrotask, MutationObserver | process.nextTick |
| 실행 타이밍 | 이벤트 루프의 각 tick 마다 1개 실행 → 끝나면 microtask 실행 | 현재 task가 끝나면 즉시 모두 실행 | 현재 task 끝 → microtask보다 먼저 실행 |
| 환경 | 브라우저 + Node.js | 브라우저 + Node.js | Node.js 전용 |
| 우선순위 | 낮음 (가장 마지막) | 중간 (task 다음, task 시작 전 X) | 최고 (task 직후, microtask 앞) |
console.log("start");
setTimeout(() => console.log("timeout"), 0);
Promise.resolve().then(() => console.log("promise"));
queueMicrotask(() => console.log("microtask"));
process.nextTick(() => console.log("nextTick"));
console.log("end");
📌 Node.js에서의 출력 순서:
start
end
nextTick // nextTickQueue → microTask보다 우선
promise // microTaskQueue
microtask // microTaskQueue
timeout // Task Queue (MacroTask)
📌 브라우저에서의 출력 순서(NextTick 없음):