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

Что такое Макрозадача в JavaScript?

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

Макрозадача (macrotask) в JavaScript — это единица работы в Event Loop, которую цикл берёт из очереди макрозадач по одной после опустошения всех микрозадач.

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

  • setTimeout, setInterval.
  • Обработчики DOM-событий (click, scroll).
  • Сетевые коллбэки, I/O.
  • setImmediate (Node.js), MessageChannel.
  • Рендеринг (условно) между макрозадачами.

Порядок в Event Loop

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

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

  • Микрозадачи (Promise, await) — все сразу, до макрозадач и рендера.
  • Макрозадачи — по одной за «тик»; между ними возможен рендеринг.

Практика

Разбиение тяжёлой работы на setTimeout даёт браузеру отрисовать UI между кусками.

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

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

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