1
JavaScriptAdvanced#event-loop#async
JavaScript runs on one call stack. When the stack empties, the loop drains all microtasks (promise callbacks, queueMicrotask) and then takes one macrotask (timers, I/O, events) — so promises always resolve before setTimeout(0).
console.log(1); setTimeout(() => console.log(4)); Promise.resolve().then(() => console.log(3)); console.log(2); // 1, 2, 3, 4