Что такое Макрозадача в 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.