Что относится к 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.