EventEmitter реализует паттерн Observer (Наблюдатель) с элементами Pub/Sub (Издатель-Подписчик). Это поведенческий паттерн, который устанавливает отношение "один-ко-многим" между объектами, позволяя автоматически уведомлять зависимые объекты об изменениях состояния.
const EventEmitter = require('events');
// Subject (Издатель)
class MyEmitter extends EventEmitter {}
const emitter = new MyEmitter();
// Observers (Наблюдатели)
const callback1 = () => console.log('Event 1 handled by Observer 1');
const callback2 = () => console.log('Event 1 handled by Observer 2');
// Подписка (добавление наблюдателей)
emitter.on('event1', callback1);
emitter.on('event1', callback2);
// Уведомление всех подписчиков
emitter.emit('event1');
EventEmitter хранит подписчиков в виде пар "событие → массив обработчиков":
// Упрощенная внутренняя реализация
class EventEmitter {
constructor() {
this._events = {};
}
on(event, listener) {
if (!this._events[event]) {
this._events[event] = [];
}
this._events[event].push(listener);
}
}
При вызове emit()
происходит итерация по всем подписанным обработчикам:
// Упрощенная реализация emit
emit(event, ...args) {
if (this._events[event]) {
const listeners = this._events[event].slice(); // Копия массива
for (const listener of listeners) {
listener.apply(this, args);
}
}
}
EventEmitter расширяет базовый Observer:
once()
)prependListener()
)data
, end
, error
request
, connection
timeout
, close
const server = require('http').createServer();
// Подписчики на разные события
server.on('request', (req, res) => {
res.end('Hello World');
});
server.on('error', (err) => {
console.error('Server error:', err);
});
server.on('listening', () => {
console.log('Server started');
});
// Запуск сервера (инициация событий)
server.listen(3000);
EventEmitter в Node.js — это мощная реализация паттерна Observer с расширенными возможностями. Он позволяет создавать гибкие системы, где компоненты могут обмениваться сообщениями, оставаясь слабосвязанными. Этот паттерн фундаментален для асинхронной, событийно-ориентированной архитектуры Node.js.