Назад к вопросам
Middle+
119
questionbank

Какова структура цикла событий в Node.js?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Цикл событий в Node.js состоит из нескольких фаз:

  1. Таймеры (Timers): Выполняются колбэки setTimeout() и setInterval().
  2. Колбэки ожидания (Pending Callbacks): Выполняются колбэки от некоторых системных операций, например, ошибок TCP-сокетов.
  3. Опрос (Poll):
    • Ищет новые события I/O (файлы, сокеты и т.д.).
    • Выполняет колбэки этих событий (кроме тех, что отложены до setImmediate()).
    • Если есть таймеры с нулевой задержкой (setImmediate()), переходит в фазу check.
    • Если нет событий I/O для обработки и скрипт не ожидает других операций, может ждать новых событий.
  4. Проверка (Check): Выполняются колбэки setImmediate().
  5. Закрывающие колбэки (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');
});