Event loop
Event Loop (цикл событий) — это механизм, который позволяет JavaScript выполнять асинхронные операции, несмотря на то, что сам язык является однопоточным. Он отвечает за обработку событий, вызовов колбэков и выполнение задач в правильном порядке.
Основные компоненты Event Loop
- Call Stack (стек вызовов):
- Это структура данных, которая отслеживает текущие выполняемые функции.
- Когда функция вызывается, она добавляется в стек. Когда функция завершается, она удаляется из стека.
- JavaScript однопоточный, поэтому в один момент времени может выполняться только одна задача.
- Web APIs (или Browser APIs):
- Это API, предоставляемые браузером (или средой выполнения, например, Node.js), которые позволяют выполнять асинхронные операции, такие как
setTimeout,fetch,XMLHttpRequest, обработка событий (клики, таймеры и т.д.). - Когда асинхронная операция запускается, она передается в Web API, и основной поток JavaScript продолжает выполнение.
- Это API, предоставляемые браузером (или средой выполнения, например, Node.js), которые позволяют выполнять асинхронные операции, такие как
- Callback Queue (очередь колбэков):
- Когда асинхронная операция завершается, ее колбэк помещается в очередь колбэков.
- Примеры: колбэки из
setTimeout, обработчики событий.
- Microtask Queue (очередь микрозадач):
- Это отдельная очередь для микрозадач, таких как промисы (
Promise) иMutationObserver. - Микрозадачи имеют приоритет над задачами из Callback Queue.
- Это отдельная очередь для микрозадач, таких как промисы (
- Event Loop:
- Это бесконечный цикл, который проверяет, пуст ли Call Stack.
- Если Call Stack пуст, Event Loop берет задачи из Callback Queue и Microtask Queue и помещает их в Call Stack для выполнения.
Как работает Event Loop
- Синхронный код:
- Весь синхронный код выполняется сразу, попадая в Call Stack.
- Асинхронный код:
- Когда встречается асинхронная операция (например,
setTimeoutилиfetch), она передается в Web API, и основной поток продолжает выполнение. - После завершения асинхронной операции ее колбэк помещается в Callback Queue (или Microtask Queue, если это промис).
- Когда встречается асинхронная операция (например,
- Обработка очередей:
- Когда Call Stack пуст, Event Loop сначала проверяет Microtask Queue.
- Все микрозадачи (например, колбэки промисов) выполняются до того, как Event Loop перейдет к Callback Queue.
- После выполнения всех микрозадач Event Loop берет задачи из Callback Queue и помещает их в Call Stack.
Пример работы Event Loop
console.log("Start");
setTimeout(() => {
console.log("Timeout");
}, 0);
Promise.resolve().then(() => {
console.log("Promise");
});
console.log("End");
Вывод:
Start
End
Promise
Timeout
Объяснение:
- Сначала выполняется синхронный код:
console.log("Start")иconsole.log("End"). setTimeoutпередается в Web API, а его колбэк попадает в Callback Queue.- Промис сразу резолвится, и его колбэк попадает в Microtask Queue.
- После завершения синхронного кода Event Loop сначала выполняет микрозадачи (колбэк промиса), а затем переходит к Callback Queue (колбэк
setTimeout).
Event Loop позволяет JavaScript эффективно обрабатывать асинхронные операции, несмотря на однопоточность. Он управляет порядком выполнения задач, используя Call Stack, Web APIs, Callback Queue и Microtask Queue. Понимание этого механизма важно для написания эффективного и предсказуемого асинхронного кода.
🚀 Источник: DeepSeek
🚀 Видеоразбор: JavaScript - Event Loop | Асинхронность, Web API, Очереди (макро/микро)задач, Отрисовка кадров