Рассмотрите этот фрагмент JavaScript: async function f(){ await Promise.resolve(); console.log(1); } console.log(0); f(); console.log(2); объясните порядок вывода и общие правила событийного цикла и очередей микрозадач/макрозадач в Node.js/браузере

9 Ноя в 21:46
3 +3
0
Ответы
1
Вывод будет: 000 222 111.
Коротко по шагам:
- Выполняется синхронный код в текущей макрозадаче: `console.log(0)` печатает 000.
- Вызов `f()` запускает async-функцию до первого `await`. `await Promise.resolve()` сразу возвращает разрешённый промис, но при `await` выполнение функции прерывается и продолжение (код после `await`) ставится в очередь микрозадач (как `Promise.resolve().then(...)`). `f()` возвращает промис и продолжается следующий синхронный код.
- `console.log(2)` печатает 222.
- После окончания текущей макрозадачи event loop обрабатывает очередь микрозадач — там находится продолжение `f()`, которое выполняет `console.log(1)`, печатает 111.
Общие правила (кратко и важно):
- Макрозадачи (tasks) — это основной цикл: обработка синхронного кода, таймеры (`setTimeout`/`setInterval`), I/O callbacks и т.п. Браузер и Node имеют свои наборы фаз/типов макрозадач.
- Микрозадачи (microtasks) — это колбэки промисов (`Promise.then`/`catch`/`finally`), `queueMicrotask`, `MutationObserver` (в браузере). В Node дополнительно есть `process.nextTick`, который имеет ещё более высокий приоритет (выполняется перед обычными промис-микрозадачами).
- После выполнения каждой макрозадачи event loop полностью опорожняет очередь микрозадач (выполняет их все подряд) перед переходом к следующей макрозадаче. Поэтому микрозадачи выполняются раньше, чем следующая отложенная макрозадача (например, `setTimeout(000)`).
- В браузере перед перерисовкой страницы тоже выполняются все микрозадачи текущей задачи.
- Вывод: `await` (на уже resolved промисе) ставит продолжение в микрозадачи, поэтому оно выполнится после синхронного кода текущей макрозадачи, но до следующей макрозадачи.
9 Ноя в 22:11
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир