Macro Tasks vs Micro Tasks
There are two queues. Microtasks (Promise callbacks, queueMicrotask) drain completely before the next macrotask (setTimeout, setInterval, I/O callbacks) runs. This is why a resolved Promise callback always fires before a setTimeout(fn, 0).