Beginner Node.js Interview QuestionsBeginnerConcept
Node.js · Question 5
What are the Node.js event loop phases?
Direct answer
libuv's loop runs timers → pending callbacks → idle/prepare → poll → check → close callbacks — with process.nextTick and Promise microtasks draining between every phase transition.
Each phase has a FIFO queue of callbacks. Node runs all callbacks in the current phase (or until a limit), then drains microtasks, then moves on — order matters for setTimeout vs setImmediate (Q7).
| Phase | Runs |
|---|---|
| timers | setTimeout / setInterval callbacks whose threshold expired |
| pending callbacks | Deferred I/O callbacks (e.g. some TCP errors) |
| idle, prepare | Internal libuv housekeeping — ignore in apps |
| poll | Fetch new I/O events; execute I/O callbacks; may block waiting |
| check | setImmediate callbacks |
| close callbacks | e.g. socket.on('close') handlers |
- Between phases — process.nextTick queue drains completely, then Promise microtasks, then next phase.
- Poll blocking — if no timers and no setImmediate, poll waits for I/O — efficient for servers.
- Node 11+ — timers phase uses libuv timer refactor; behavior stable for interviews but mention version if asked.
phases-demo.js
import fs from "node:fs";
setTimeout(() => console.log("timers phase"), 0);
setImmediate(() => console.log("check phase"));
fs.readFile(__filename, () => {
console.log("poll phase — I/O callback");
setTimeout(() => console.log("timer inside I/O cb"), 0);
setImmediate(() => console.log("immediate inside I/O cb"));
});