Цикл событий JavaScript: Неблокирующее асинхронное выполнение
Цикл событий JavaScript управляет асинхронными операциями, выполняя колбэки из очереди, когда стек вызовов пуст, предотвращая блокировку потока.
Loop. Control structure repeating code until condition is met. Generated ELI5 content
graph LR
Center["Цикл событий JavaScript: Неблокирующее асинхронное выполнение"]:::main
Pre_variable["variable"]:::pre --> Center
click Pre_variable "/terms/variable"
Rel_iteration["iteration"]:::related -.-> Center
click Rel_iteration "/terms/iteration"
Rel_recursion["recursion"]:::related -.-> Center
click Rel_recursion "/terms/recursion"
Rel_closed_loop_life_support["closed-loop-life-support"]:::related -.-> Center
click Rel_closed_loop_life_support "/terms/closed-loop-life-support"
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.