Консоль выведет в точно таком порядке:
start → end → promise 1 → promise 2 → timeout 1 → timeout 2
JavaScript использует Event Loop, который обрабатывает задачи в строгом порядке приоритета:
setTimeout) выполняются в последнюю очередь, по одной на итерацию event loopconsole.log("start") — синхронный, выполняется сразу жеsetTimeout регистрируются и отправляются в очередь macrotaskPromise.resolve().then(...) ставятся в очередь microtaskconsole.log("end") — синхронный, выполняется сразу жеКак только call stack становится пуст, очередь microtask полностью опустошается:
"promise 1" — этот колбэк также регистрирует новый setTimeout, который попадает в очередь macrotask"promise 2"Наконец, macrotasks выполняются в порядке регистрации:
"timeout 1" (зарегистрирован первым)"timeout 2" (зарегистрирован внутри колбэка Promise, поэтому добавлен после timeout 1)Критическое правило: microtasks всегда выполняются перед macrotasks. Несмотря на то что setTimeout(..., 0) имеет нулевую задержку, он не может выполниться до тех пор, пока все ожидающие microtasks не будут завершены. Кроме того, любые новые microtasks, добавленные во время обработки microtask, выполняются перед тем, как управление вернётся в очередь macrotask.
Микротаски, поставленные в очередь во время выполнения других микротасков, будут выполнены до запуска любых макротасков, даже если эти макротаски были зарегистрированы раньше.
Новый — ещё не проверен сообществом
Вы