JavaScript использует event loop для управления выполнением кода через три этапа: call stack (стек вызовов), microtask queue (очередь микротасков) и macrotask queue (очередь макротасков).
Start
End
Promise
Timeout
console.log("Start") — выполняется сразу же как синхронный код, выводит StartsetTimeout(...) — помещает колбэк в macrotask queue, даже при задержке 0msPromise.resolve().then(...) — помещает колбэк в microtask queueconsole.log("End") — выполняется сразу же как синхронный код, выводит EndEvent loop следует строгой системе приоритетов после того, как call stack пуст:
PromisesetTimeoutsetTimeout с задержкой 0ms не означает, что он выполнится сразу. Это означает, что он выполнится как можно скорее — но только после того, как весь синхронный код и все ожидающие микротаски будут обработаны. Именно поэтому Promise всегда выводится раньше Timeout.
Callback из setTimeout выполняется раньше callback'а из Promise.resolve().then(), потому что оба асинхронные, но setTimeout зарегистрирован первым в коде.
Новый — ещё не проверен сообществом
Вы