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

В чем разница между micro task и macro task?

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

Microtask и macrotask — две очереди задач Event Loop с разным приоритетом. Микрозадачи выполняются раньше и полностью, макрозадачи — по одной после них.

Микрозадачи

  • Источники: Promise.then/catch/finally, queueMicrotask, await, MutationObserver.
  • Выполняются все сразу после текущей синхронной задачи, до следующей макрозадачи и до рендеринга.

Макрозадачи

  • Источники: setTimeout, setInterval, setImmediate, обработчики событий, I/O.
  • Выполняются по одной за «тик»; между ними возможен рендеринг.

Порядок в Event Loop

1. Синхронный код.
2. Опустошить ВСЮ очередь микрозадач.
3. Взять ОДНУ макрозадачу.
4. Снова опустошить микрозадачи.
console.log('sync');
setTimeout(() => console.log('macro'), 0);
Promise.resolve().then(() => console.log('micro'));
// sync → micro → macro

Главное различие

  • Приоритет: микрозадачи выше — всегда выполняются раньше макрозадач.
  • Порядок: микрозадачи — все подряд, макрозадачи — по одной.
  • Бесконечная генерация микрозадач блокирует рендер и макрозадачи.

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

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

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