В чем разница между 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).