Назад к вопросам
Middle+
119
questionbank
Какова структура цикла событий в Node.js?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Цикл событий в Node.js состоит из нескольких фаз:
- Таймеры (Timers): Выполняются колбэки
setTimeout()иsetInterval(). - Колбэки ожидания (Pending Callbacks): Выполняются колбэки от некоторых системных операций, например, ошибок TCP-сокетов.
- Опрос (Poll):
- Ищет новые события I/O (файлы, сокеты и т.д.).
- Выполняет колбэки этих событий (кроме тех, что отложены до
setImmediate()). - Если есть таймеры с нулевой задержкой (
setImmediate()), переходит в фазуcheck. - Если нет событий I/O для обработки и скрипт не ожидает других операций, может ждать новых событий.
- Проверка (Check): Выполняются колбэки
setImmediate(). - Закрывающие колбэки (Close Callbacks): Выполняются колбэки для событий закрытия
close, например, при закрытии сокета.
Нестандартные моменты:
process.nextTick(): Выполняется между фазами цикла событий и перед любым колбэком в текущей фазе. Имеет более высокий приоритет.- Промисы (Promises): Обработчики промисов (
.then(),.catch(),.finally()) также выполняются как микрозадачи, сразу после выполнения текущей операционной задачи или функции, прежде чем цикл событий перейдет к следующей фазе или обработает другие макрозадачи (например, таймеры или I/O).
Структура фаз:
┌───────────────┐
┌─>│ timers │
│ └───────────────┘
│ ┌───────────────┐
│ │ pending callbacks │
│ └───────────────┘
│ ┌───────────────┐
│ │ idle, prepare │
│ └───────────────┘ ┌───────────────┐
│ ┌───────────────┐ │ poll │
└──┤ poll ├───>│ (I/O callbacks, check timers) │
└───────────────┘ └───────────────┘
┌───────────────┐
│ check │
└───────────────┘
┌───────────────┐
│ close callbacks │
└───────────────┘
Пример выполнения setImmediate vs setTimeout:
// setImmediate выполняется в фазе check,
// setTimeout в фазе timers.
// Порядок выполнения будет зависеть от внешних факторов I/O,
// но setImmediate гарантированно выполнится после текущей фазы poll.
setTimeout(() => {
console.log('setTimeout 0ms');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
Пример выполнения process.nextTick:
// process.nextTick выполняется перед setImmediate и setTimeout,
// даже если они имеют нулевую задержку.
process.nextTick(() => {
console.log('process.nextTick');
});
setTimeout(() => {
console.log('setTimeout 0ms');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});