- setTimeout(fn, delay) - 최소 delay(ms)가 지난 뒤, fn을 실행하도록 Timers 큐에 등록 - setInterval(fn, interval) - interval(ms)마다 반복 실행되도록 Timers 큐에 등록 - setImmediate(fn) - 현재 이벤트 루프 사이클이 끝난 직후, Check 큐에서 실행 핵심: - se...
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
- setImmediateMicrotask는 이벤트 루프 phase를 건너뛰고 즉시 실행