JavaScript uses a single-threaded event loop. When the call stack is clear, all pending microtasks (Promises, queueMicrotask) execute before the next macrotask (setTimeout, I/O).
js
setTimeout(() => console.log("macro"));
Promise.resolve().then(() => console.log("micro"));
// micro logs before macro