Middle+
Tell me about the event loop mechanism in Node.js.
sobes.tech AI
Answer from AI
The Event Loop allows Node.js to perform non-blocking input/output operations despite JavaScript being single-threaded. It continuously polls the event queue and executes callbacks.
The main phases of the Event Loop (in execution order):
- timers: Executes callbacks for
setTimeout()andsetInterval(). - pending callbacks: Handles operations scheduled for the next iteration of the cycle.
- idle, prepare: Used by Node.js internal logic.
- poll: The main phase. Waits for new input/output events, executes callbacks for them. It can block if there are no active timers or
setImmediate()callbacks. - check: Executes callbacks for
setImmediate(). - close callbacks: Handles close event callbacks, e.g.,
socket.on('close', ...).
After each event cycle phase, Node.js checks microtasks:
- process.nextTick(): Callbacks scheduled with
process.nextTick()are executed before any other microtasks or moving to the next Event Loop phase. - Promise callbacks: Promise
.then(),.catch(),.finally()callbacks andawaitare executed afterprocess.nextTick()and before the next Event Loop phase.
Example of Event Loop operation:
// Scheduled in the timers phase of the next cycle
setTimeout(() => {
console.log('Timer (timers phase)');
}, 0);
// Scheduled in the check phase of the next cycle
setImmediate(() => {
console.log('Immediate (check phase)');
});
// Executed immediately in the current microtask queue
process.nextTick(() => {
console.log('Next Tick (microtask)');
});
// Promise also adds callbacks to the microtask queue
Promise.resolve().then(() => {
console.log('Promise (microtask)');
});
console.log('Start of execution (immediate)');
Expected output:
Start of execution (immediate)
Next Tick (microtask)
Promise (microtask)
Timer (timers phase) // May appear earlier or later "Immediate", depends on load
Immediate (check phase) // May appear earlier or later "Timer", depends on load
The Event Loop is managed by the libuv library, which provides an abstraction over low-level input/output operations and task scheduling mechanisms in the operating system.