The event loop lets Node.js do many things at once by managing tasks in steps called phases. Timers run in a special phase to schedule code after a delay.
Event loop phases and timer execution in Node.js
Start learning this pattern below
Jump into concepts and practice - no test required
setTimeout(callback, delay) setInterval(callback, delay)
setTimeout runs the callback once after the delay (in milliseconds).
setInterval runs the callback repeatedly every delay milliseconds.
setTimeout(() => {
console.log('Hello after 1 second');
}, 1000);setInterval(() => {
console.log('Repeats every 2 seconds');
}, 2000);console.log('Start'); setTimeout(() => { console.log('Timeout'); }, 0); console.log('End');
This program shows how timer callbacks run after the current code finishes, in the timers phase of the event loop. The shorter delay callback runs first.
console.log('Phase 1: Start'); setTimeout(() => { console.log('Timer callback runs in timers phase'); }, 100); setTimeout(() => { console.log('Another timer callback'); }, 50); console.log('Phase 1: End');
Timers run in the timers phase of the event loop, after the current code completes.
Even a 0 ms delay means the callback waits until the timers phase, so it runs after synchronous code.
Callbacks with shorter delays usually run before longer delays, but exact timing depends on system and event loop state.
The event loop has phases; timers run in the timers phase.
setTimeout schedules code to run after a delay in the timers phase.
Even zero delay callbacks run after current synchronous code finishes.
Practice
setTimeout callbacks?Solution
Step 1: Understand event loop phases
The Node.js event loop has multiple phases, each handling different types of callbacks.Step 2: Identify where timers run
The timers phase is specifically designed to execute callbacks scheduled bysetTimeoutandsetInterval.Final Answer:
Timers phase -> Option BQuick Check:
Timers phase = setTimeout callbacks [OK]
- Confusing timers phase with poll phase
- Thinking setTimeout runs immediately
- Mixing check phase with timers phase
Solution
Step 1: Check function syntax for setTimeout
The first argument must be a function, not the result of a function call.Step 2: Analyze each option
setTimeout(() => console.log('Hi'), 0); passes a function that logs 'Hi' after 0 ms delay correctly. setTimeout(console.log('Hi'), 0); calls console.log immediately and passes its result (undefined). setTimeout(0, () => console.log('Hi')); passes 0 (number) as first argument instead of a function, causing a TypeError on execution. setTimeout(console.log('Hi')) calls console.log immediately without delay argument.Final Answer:
setTimeout(() => console.log('Hi'), 0); -> Option DQuick Check:
Function as first argument = setTimeout(() => console.log('Hi'), 0); [OK]
- Calling the function immediately inside setTimeout
- Omitting the delay argument
- Passing non-function as first argument
console.log('Start');
setTimeout(() => console.log('Timeout 1'), 0);
setTimeout(() => console.log('Timeout 2'), 10);
console.log('End');Solution
Step 1: Identify synchronous and asynchronous parts
console.log('Start') and console.log('End') run immediately in order. setTimeout callbacks run later.Step 2: Understand timer delays and event loop
setTimeout with 0 ms delay runs after current code finishes, before 10 ms delay callback.Final Answer:
Start, End, Timeout 1, Timeout 2 -> Option AQuick Check:
Synchronous logs first, then timers by delay [OK]
- Assuming 0 ms timeout runs immediately
- Mixing order of synchronous and asynchronous logs
- Ignoring timer delays
setTimeout(console.log('Hello'), 1000);Solution
Step 1: Analyze the first argument of setTimeout
console.log('Hello') is called immediately, returning undefined, which is passed to setTimeout.Step 2: Understand correct usage
setTimeout expects a function as first argument, not the result of a function call.Final Answer:
console.log is called immediately instead of after 1000ms -> Option CQuick Check:
Function call inside setTimeout runs immediately [OK]
- Thinking delay argument is missing
- Passing string instead of function
- Believing delay must be zero or negative
console.log('A');
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
console.log('D');
What is the correct order of output?Solution
Step 1: Identify synchronous, microtask, and timers
console.log('A') and console.log('D') run immediately. Promise.then callbacks run in microtasks after current code. setTimeout callbacks run in timers phase later.Step 2: Determine execution order
Output order is synchronous logs first (A, D), then microtasks (C), then timers (B).Final Answer:
A, D, C, B -> Option AQuick Check:
Microtasks run before timers [OK]
- Assuming setTimeout runs before Promise.then
- Mixing synchronous and asynchronous order
- Ignoring microtask queue priority
