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

Какие существуют сценарии реализации работы Event Loop в Node.js?

Sobes Copilot

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

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

sobes.tech AI

Event Loop в Node.js работает в итерациях (тиках) и обрабатывает следующие фазы:

  1. Timers: обрабатывает колбэки setTimeout() и setInterval().
  2. Pending callbacks: выполняет колбэки I/O операций, отложенные в предыдущей итерации.
  3. Idle, prepare: внутреннее использование Node.js.
  4. Poll:
    • Выполняет колбэки I/O (в большинстве случаев).
    • Если нет готовых к выполнению I/O колбэков, может ждать новых соединений/событий или переходить к фазе Check.
  5. Check: выполняет колбэки setImmediate().
  6. Close callbacks: выполняет колбэки закрытия, например, для сокетов ('close').

Между основными фазами Event Loop, а также после выполнения каждой фазы, Node.js проверяет и выполняет следующие очереди микрозадач:

  • process.nextTick() queue: имеет наивысший приоритет и выполняется перед всеми другими микрозадачами и фазами Event Loop.
  • Promise queue: выполняет resolved промисы.

Пример:

// Выполняется перед setTimeout, setImmediate и I/O колбэками
process.nextTick(() => {
  console.log('nextTick');
});

// Выполняется в фазе Timers
setTimeout(() => {
  console.log('timeout');
}, 0);

// Выполняется в фазе Check
setImmediate(() => {
  console.log('immediate');
});

// Пример асинхронной I/O операции
const fs = require('fs');
fs.readFile(__filename, () => {
  // Выполняется в фазе Poll
  console.log('read file');
});

// Пример промиса
Promise.resolve().then(() => {
  // Выполняется в очереди промисов
  console.log('promise');
});

Порядок вывода в консоль будет примерно таким:

nextTick
promise
timeout
read file
immediate

(порядок read file и immediate может меняться в зависимости от выполнения I/O операции).