Что такое EventEmitter

Ответ

EventEmitter — это паттерн, позволяющий объектам подписываться на события и реагировать на них. В JavaScript он часто реализуется через класс, который предоставляет методы on (подписка), emit (инициация события) и off (отписка).

Пример реализации:

class EventEmitter {
  constructor() {
    this.events = {};
  }

  on(event, listener) {
    if (!this.events[event]) this.events[event] = [];
    this.events[event].push(listener);
  }

  emit(event, ...args) {
    if (this.events[event]) {
      this.events[event].forEach(listener => listener(...args));
    }
  }

  off(event, listener) {
    if (this.events[event]) {
      this.events[event] = this.events[event].filter(l => l !== listener);
    }
  }
}

Использование:

const emitter = new EventEmitter();
emitter.on('message', (text) => console.log(text));
emitter.emit('message', 'Hello!'); // Выведет "Hello!"

Используется в Node.js (events модуль), Vue.js (EventBus) и других библиотеках.

Ответ 18+ 🔞

Смотри, ну это же просто, как два пальца об асфальт! EventEmitter — это такая штука, которая позволяет объектам подписываться на всякие события и, типа, реагировать на них. В JavaScript его обычно делают через класс, у которого есть методы on (чтобы подписаться), emit (чтобы событие запустить) и off (чтобы отписаться, если надоело).

Вот, смотри, пример кода, тут всё чётко:

class EventEmitter {
  constructor() {
    this.events = {};
  }

  on(event, listener) {
    if (!this.events[event]) this.events[event] = [];
    this.events[event].push(listener);
  }

  emit(event, ...args) {
    if (this.events[event]) {
      this.events[event].forEach(listener => listener(...args));
    }
  }

  off(event, listener) {
    if (this.events[event]) {
      this.events[event] = this.events[event].filter(l => l !== listener);
    }
  }
}

А теперь, блядь, как это использовать, чтобы вообще стало понятно:

const emitter = new EventEmitter();
emitter.on('message', (text) => console.log(text));
emitter.emit('message', 'Hello!'); // Выведет "Hello!", ёпта!

Эта хуйня, кстати, используется в Node.js (там целый модуль events есть), во Vue.js (EventBus, ну ты знаешь) и куче других библиотек. Вообще, удобная штука, если разобраться, а то сидишь и думаешь: "Э, бошка, думай, как это всё связать?" — а тут всё просто, как ёперный театр!