Event Loop: мікрозадачі vs макрозадачі
Event Loop — це механізм у JavaScript, який керує асинхронними задачами та чергами подій. Він дозволяє JavaScript працювати в однопоточній моделі, обробляючи асинхронні операції без блокування основного потоку виконання.
Як працює Event Loop?
Event Loop — це безкінечний цикл, який виконує обробники подій. Під час своєї роботи браузер розподіляє задачі на дві основні черги:
- Мікрозадачі — задачі, такі як проміси,
queueMicrotask(),MutationObserver. - Макрозадачі — задачі, такі як
setTimeout, події, таймери, запитиfetch.
Основний порядок виконання
- Спочатку виконуються всі синхронні задачі з Call Stack.
- Потім виконуються всі задачі з черги мікрозадач. Усі мікрозадачі виконуються перед тим, як буде взято наступну макрозадачу.
- Після виконання всіх мікрозадач черга очищається.
- Далі одна макрозадача береться з черги макрозадач і виконується.
- Після виконання макрозадачі браузер перевіряє, чи потрібно перемалювати сторінку.
- Цикл повторюється.
Структури даних
-
Call Stack (LIFO — останній прийшов, перший вийшов):
- містить усі функції, що виконуються в даний момент;
- виклик функції додає її до стеку;
- після виконання функція видаляється зі стеку.
-
Web API:
- асинхронні операції (
setTimeout, події,fetch) обробляються поза Call Stack; - після завершення вони потрапляють у чергу колбеків.
- асинхронні операції (
-
Callback Queue (FIFO — перший прийшов, перший вийшов):
- зберігає функції, які мають виконатися, коли стек викликів стане порожнім;
- Event Loop переносить їх у Call Stack для виконання.
Мікрозадачі vs макрозадачі
-
Макрозадачі:
- приклади:
setTimeout, події (onClick,onChange),fetch; - виконуються по одній після синхронного коду та мікрозадач.
- приклади:
-
Мікрозадачі:
- приклади: проміси,
queueMicrotask(),MutationObserver; - виконуються одразу після синхронного коду і перед макрозадачами.
- приклади: проміси,
Приклад
javascript
console.log("First message");
setTimeout(() => {
console.log("Second message");
}, 0);
Promise.resolve().then(() => console.log("Third message"));
console.log("Fourth message");Що відбувається:
First messageвиводиться першим (синхронний код).setTimeout(..., 0)додає колбек у чергу макрозадач.Promise.resolve().then(...)додає колбек у чергу мікрозадач.Fourth messageвиводиться далі (синхронний код).- Після синхронного коду виконується мікрозадача:
Third message. - Потім виконується макрозадача:
Second message.
Важливо: мікрозадачі мають вищий пріоритет над макрозадачами.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.