PassFront
  1. PassFront
  2. База знаний
  3. Асинхронность и Event Loop

Что такое микрозадача?

Асинхронность и Event Loop

Микрозадача (microtask) — это коллбэк из очереди высокого приоритета, которую Event Loop опустошает полностью сразу после текущей синхронной задачи и перед следующей макрозадачей.

Источники микрозадач

  • Promise.then / catch / finally.
  • await (продолжение async-функции).
  • queueMicrotask().
  • Коллбэки MutationObserver.

Приоритет

После освобождения стека Event Loop выполняет все микрозадачи (включая добавленные по ходу), и только потом берёт одну макрозадачу (setTimeout, событие).

console.log('sync');
setTimeout(() => console.log('macro'), 0);
Promise.resolve().then(() => console.log('micro'));
// sync → micro → macro

micro раньше macro, даже при задержке 0.

Микрозадачи против макрозадач

  • Микрозадачи — все подряд, до макрозадач и рендера.
  • Макрозадачи — по одной за «тик».

Осторожно

Бесконечная генерация микрозадач блокирует рендеринг и макрозадачи — страница «зависнет».

Коротко для собеседования

Микрозадача (Promise, await, queueMicrotask, MutationObserver) — коллбэк из приоритетной очереди, которая опустошается целиком после текущего кода и раньше макрозадач. Поэтому Promise.then срабатывает раньше setTimeout(…, 0).

Другие вопросы раздела