> Как реализовать хранение нескольких колбэков для одного события в EventEmitter (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Т-Банк
Стек: JavaScript
> Пример ответа
Для хранения нескольких колбэков для одного события в EventEmitter можно использовать структуру данных, где ключом является имя события, а значением - массив функций-обработчиков. Вот простая реализация на JavaScript:
JAVASCRIPTclass 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 для более быстрого удаления.
> Похожие задачи по frontend
Что происходит при встрече промиса во время выполнения синхронного кода в JavaScript
Как улучшить реализацию EventEmitter с использованием Map и Set в JavaScript
Может ли быть несколько экземпляров лексического окружения замыкания в JavaScript
Какая польза от внутренней функции, используемой снаружи внешней функции в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью