Как работает
- Call Stack — синхронный код выполняется последовательно
- При встрече async-операции (HTTP-запрос, setTimeout) — она передаётся в Web API/libuv и выполняется вне основного потока
- Когда операция завершена — коллбек попадает в Callback Queue
- Event Loop проверяет: если Call Stack пуст — переносит коллбек в стек
Macrotasks vs Microtasks
Microtasks (Promise.then, queueMicrotask) выполняются перед следующим macrotask (setTimeout, setInterval). Поэтому Promise.resolve().then(fn) выполнится раньше setTimeout(fn, 0).