Объясните порядок вывода в этом JavaScript‑кейсе и почему он такой: "console.log('A'); setTimeout(()=>console.log('B'),0); Promise.resolve().then(()=>console.log('C')); console.log('D');" — какие концепции event loop и микротасков здесь задействованы
Вывод будет в порядке: A D C B. Краткое пошаговое объяснение (числа в порядке выполнения): 111 Выполняются синхронные инструкции сверху вниз: `console.log('A')` печатает "A". 222 `setTimeout(..., 000)` не выполняет callback сразу — он ставит его в очередь макротасков (task queue) с задержкой 000. 333 `Promise.resolve().then(...)` добавляет callback в очередь микротасков (microtask queue, job queue). 444 Синхронный `console.log('D')` выполняется и печатает "D". После того как текущий стек вызовов опустел: 555 Event loop сначала опустошает очередь микротасков: выполняется `.then(...)` → печатается "C". 666 Только потом берётся следующий макротаск из очереди (здесь — callback от `setTimeout`) → печатается "B". Почему так: микротаски (промисы) имеют более высокий приоритет и запускаются сразу после завершения текущего таска/стека, но до выполнения следующего макротаска (`setTimeout`). Значение задержки 000 не гарантирует немедленного выполнения — это просто минимальная задержка перед помещением callback в очередь макротасков. (Примечание: в браузере микротаски также выполняются перед перерисовкой; в Node есть дополнительные фазы event loop и `process.nextTick`, у которого ещё более высокий приоритет.)
Краткое пошаговое объяснение (числа в порядке выполнения):
111 Выполняются синхронные инструкции сверху вниз: `console.log('A')` печатает "A".
222 `setTimeout(..., 000)` не выполняет callback сразу — он ставит его в очередь макротасков (task queue) с задержкой 000.
333 `Promise.resolve().then(...)` добавляет callback в очередь микротасков (microtask queue, job queue).
444 Синхронный `console.log('D')` выполняется и печатает "D".
После того как текущий стек вызовов опустел:
555 Event loop сначала опустошает очередь микротасков: выполняется `.then(...)` → печатается "C".
666 Только потом берётся следующий макротаск из очереди (здесь — callback от `setTimeout`) → печатается "B".
Почему так: микротаски (промисы) имеют более высокий приоритет и запускаются сразу после завершения текущего таска/стека, но до выполнения следующего макротаска (`setTimeout`). Значение задержки 000 не гарантирует немедленного выполнения — это просто минимальная задержка перед помещением callback в очередь макротасков.
(Примечание: в браузере микротаски также выполняются перед перерисовкой; в Node есть дополнительные фазы event loop и `process.nextTick`, у которого ещё более высокий приоритет.)