← Назад к вопросам

Где невозможно обойтись без callback в Node.js и почему?

1.7 Middle🔥 191 комментариев
#Node.js и JavaScript#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Callback остаются неотъемлемой частью Node.js в нескольких критических сценариях, несмотря на наличие Promise и async/await.

1. Event Emitters

Основной механизм Node.js - события, которые могут выпускаться многократно:

const stream = fs.createReadStream("file.txt");
stream.on("data", (chunk) => { console.log(chunk); });
stream.on("end", () => { console.log("Done"); });

Promise не подходит, потому что это одноразовое значение, а события повторяются.

2. Signal Handlers

Обработка системных сигналов требует callback:

process.on("SIGTERM", () => {
  server.close(() => { process.exit(0); });
});

Это архитектурный паттерн, не асинхронная операция.

3. Встроенные API

Некоторые встроенные функции имеют только callback версию:

fs.watch("file.txt", (eventType, filename) => {
  console.log(eventType, filename);
});

4. Higher-order Functions (Strategy Pattern)

Когда callback - это часть архитектуры:

function processArray(arr, transform, onComplete) {
  const result = arr.map(transform);
  onComplete(result);
}

processArray([1, 2, 3], x => x * 2, (result) => {
  console.log(result);
});

Это не асинхронный код, а передача функции как стратегии.

5. Worker Threads Communication

const { Worker } = require("worker_threads");
const worker = new Worker("./worker.js");

worker.on("message", (result) => {
  console.log(result);
});

Worker отправляет сообщения в фоне, await здесь застопит весь код.

6. Fire-and-Forget операции

server.on("request", (req, res) => {
  // Запускаем операцию в фоне, не ждём её
  processAsync().then(() => console.log("Done"));
  res.send("Processing...");
});

Callback для event обработчиков - единственный способ.

7. Cluster Communication

if (cluster.isMaster) {
  cluster.on("message", (worker, message) => {
    console.log(`Worker: ${message}`);
  });
}

Вывод

Callback невозможно избежать потому что:

  • Event-driven архитектура Node.js
  • Promise = одноразовое значение, события = поток значений
  • Системный API (сигналы, процессы) использует callback
  • Архитектурные паттерны (Observer, Strategy) требуют callback

Современный код смешивает callback (для событий) и async/await (для операций).