Hint
Each macrotask fully drains the microtask queue before the next macrotask runs.
console.log('start');
setTimeout(() => {
console.log('timeout 1');
Promise.resolve().then(() => console.log('promise inside timeout'));
}, 0);
Promise.resolve()
.then(() => {
console.log('promise 1');
setTimeout(() => console.log('timeout inside promise'), 0);
})
.then(() => console.log('promise 2'));
console.log('end');start end promise 1 promise 2 timeout 1 promise inside timeout timeout inside promise
Explanation: 1. Sync: "start", "end"
2. Microtask queue: "promise 1" (queues a setTimeout), then "promise 2"
3. Macrotask: "timeout 1" (queues a microtask), then its microtask "promise inside timeout"
4. Last macrotask: "timeout inside promise"
Key Insight: Each macrotask fully drains the microtask queue before the next macrotask runs.