> Как реализовать хранение нескольких колбэков для одного события в EventEmitter (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Т-Банк

Стек: JavaScript

> Пример ответа

Для хранения нескольких колбэков для одного события в EventEmitter можно использовать структуру данных, где ключом является имя события, а значением - массив функций-обработчиков. Вот простая реализация на JavaScript:

JAVASCRIPT
class EventEmitter {
constructor() {
this.events = {}; // { eventName: [callback1, callback2, ...] }
}
on(eventName, callback) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(callback);
return this; // для цепочечного вызова
}
emit(eventName, ...args) {
const callbacks = this.events[eventName];
if (!callbacks) return false;
callbacks.forEach(callback => callback(...args));
return true;
}
off(eventName, callback) {
const callbacks = this.events[eventName];
if (!callbacks) return;
this.events[eventName] = callbacks.filter(cb => cb !== callback);
}
once(eventName, callback) {
const wrapper = (...args) => {
callback(...args);
this.off(eventName, wrapper);
};
this.on(eventName, wrapper);
}
}
// Пример использования:
const emitter = new EventEmitter();
emitter.on('data', (msg) => console.log('Первый:', msg));
emitter.on('data', (msg) => console.log('Второй:', msg));
emitter.emit('data', 'Привет'); // Выведет оба сообщения

Ключевые моменты:

  • Массив позволяет хранить множество обработчиков для одного события.
  • Метод emit вызывает все функции из массива по порядку.
  • off удаляет конкретный колбэк, фильтруя массив.
  • once создает обертку, которая автоматически отписывается после первого вызова.

Эта реализация эффективна для большинства сценариев, но для очень большого количества обработчиков можно рассмотреть использование Set для более быстрого удаления.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью