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

Что такое micro task?

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

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

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

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

Приоритет над макрозадачами

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

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

Опасность

Микрозадачи выполняются до рендера и до макрозадач. Бесконечная генерация микрозадач «заморозит» страницу, не дав дойти до отрисовки:

function loop() {
  queueMicrotask(loop); // блокирует всё
}

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

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

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