Цикл событий JavaScript Неблокирующее асинхронное выполнение

Цикл событий JavaScript управляет асинхронными операциями, выполняя колбэки из очереди, когда стек вызовов пуст, предотвращая блокировку потока.

The event loop is a fundamental process in JavaScript's runtime environments (browsers, Node.js) that enables non-blocking asynchronous behavior. Since JavaScript is single-threaded, it can execute only one operation at a time. Without the event loop, long-running tasks (e.g., network requests, timers) would halt the main thread, leading to an unresponsive application. The event loop operates alongside the call stack, browser Web APIs (or Node.js APIs), and a task queue (or callback queue). When an asynchronous task is initiated, it's delegated to the appropriate API. Upon completion, its associated callback function is placed in the task queue. The event loop continuously checks if the call stack is clear. If it is, it dequeues the oldest callback from the task queue and pushes it onto the call stack for execution. This cycle ensures that asynchronous operations are handled efficiently without blocking the primary thread.

        graph LR
  Center["Цикл событий JavaScript Неблокирующее асинхронное выполнение"]:::main
  classDef main fill:#7c3aed,stroke:#8b5cf6,stroke-width:2px,color:white,font-weight:bold,rx:5,ry:5;
  classDef pre fill:#0f172a,stroke:#3b82f6,color:#94a3b8,rx:5,ry:5;
  classDef child fill:#0f172a,stroke:#10b981,color:#94a3b8,rx:5,ry:5;
  classDef related fill:#0f172a,stroke:#8b5cf6,stroke-dasharray: 5 5,color:#94a3b8,rx:5,ry:5;
  linkStyle default stroke:#4b5563,stroke-width:2px;

      

🧒 Простыми словами

Представьте [JavaScript](/ru/terms/javascript) как повара, который может делать только одно дело одновременно. Если ему нужно испечь торт (долгая задача), он не будет просто стоять и ждать. Он поставит торт в духовку и установит таймер, а затем немедленно начнет готовить салат (другая задача). Когда прозвенит таймер духовки, повар закончит салат, достанет торт и перейдет к следующему делу. Цикл событий похож на систему повара для управления этими «ожидающими» задачами, гарантируя, что они будут выполнены, когда будут готовы, не останавливая другую работу.

🤓 Expert Deep Dive

Цикл событий JavaScript — это модель конкуренции, которая оркестрирует выполнение кода, задач и событий. Он постоянно отслеживает стек вызовов и очередь (очереди) задач. Синхронный код выполняется непосредственно в стеке вызовов. Асинхронные операции (например, setTimeout, Promises, I/O) передаются API хост-среды, которые управляют их выполнением. Как только асинхронная операция завершена, ее колбэк (или обработчик разрешения Promise) помещается в соответствующую очередь — очередь задач (для макрозадач, таких как setTimeout, DOM-события) или очередь микрозадач (для микрозадач, таких как Promises, queueMicrotask). Основная функция цикла событий заключается в том, чтобы, когда стек вызовов пуст, извлекать задачи из очереди и выполнять их. Микрозадачи обычно обрабатываются перед макрозадачами. В частности, после завершения текущей макрозадачи и перед началом следующей, цикл событий выполнит все доступные микрозадачи. Это придает приоритет немедленным колбэкам (таким как разрешения Promise) над отложенными, обеспечивая отзывчивость и эффективную обработку асинхронных операций в различных средах JavaScript.

📚 Источники