Что такое micro task?
Асинхронность и Event Loop
Микрозадача (microtask) — это коллбэк из очереди высокого приоритета, которую Event Loop опустошает полностью сразу после каждой синхронной задачи и перед следующей макрозадачей.
Что попадает в микрозадачи
- Коллбэки
Promise.then / catch / finally. queueMicrotask().await(продолжение async-функции).- Коллбэки
MutationObserver.
Приоритет над макрозадачами
После освобождения стека Event Loop выполняет все микрозадачи (включая добавленные по ходу), и только потом берёт одну макрозадачу (setTimeout, событие).
console.log('sync');
setTimeout(() => console.log('macro'), 0);
Promise.resolve().then(() => console.log('micro'));
// sync, micro, macroОпасность
Микрозадачи выполняются до рендера и до макрозадач. Бесконечная генерация микрозадач «заморозит» страницу, не дав дойти до отрисовки:
function loop() {
queueMicrotask(loop); // блокирует всё
}Коротко для собеседования
Микрозадачи (Promise, queueMicrotask, await) выполняются раньше макрозадач: после текущего синхронного кода очередь микрозадач опустошается целиком, потом берётся одна макрозадача. Поэтому .then срабатывает раньше setTimeout(…, 0).