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

Что относится к macrotask?

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

К макрозадачам (macrotasks) относятся коллбэки таймеров, событий, I/O и рендеринга — задачи, которые Event Loop берёт по одной после опустошения очереди микрозадач.

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

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

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

После каждой макрозадачи Event Loop опустошает всю очередь микрозадач (Promise, queueMicrotask), и только потом берёт следующую макрозадачу.

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

Практическое следствие

  • Одна макрозадача = один «тик» + все микрозадачи после неё.
  • Между макрозадачами браузер может выполнить рендеринг, поэтому разбиение тяжёлой работы на setTimeout даёт UI «дышать».

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

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

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