setImmediate()setTimeout(fn, delay)
setInterval(fn, interval)
setImmediate(fn)
핵심:
setTimout / setInterval -> 시간 기준setImmediate -> 이벤트 루프 단계 기준┌─────────────┐
│ timers │ ← setTimeout, setInterval
├─────────────┤
│ pending cb │
├─────────────┤
│ idle/prepare│
├─────────────┤
│ poll │ ← I/O 대기 & 콜백 실행
├─────────────┤
│ check │ ← setImmediate
├─────────────┤
│ close cb │
└─────────────┘
setTimeout(fn, 0);
setInterval(fn, 1000);
setImmediate(fn);
"I/O 콜백 이후에, 다음 timers 전에 실행하고 싶다"
즉
setTimeout(0)보다, I/O 콜백 이후 실행이 더 보장됨require('fs').readFile(__filename, () => {
setTimeout(() => console.log('timeout'), 0);
setImmediate(() => console.log('immediate'));
});
결과는 항상
immediate
timeout
이유:
매 이벤트 루프의 timers 단계에서 검사
interval이 지났으면 실행
실행이 밀리면 다음 실행도 밀림
누적 실행 X
그래서 정확한 주기 작업에는
핵심 규칙
Promise (
then,finally)는 setImmediate보다 항상 먼저 실행된다
이유:
실행 우선순위 요약
현재 콜스택
↓
Microtask Queue
- Promise.then
- Promise.finally
- queueMicrotask
↓
(Event loop phase 이동)
↓
Check phase
- setImmediate
Microtask는 이벤트 루프 phase를 건너뛰고 즉시 실행