Вопрос проверяет понимание выбора структуры данных для хранения подписчиков в EventEmitter и их влияния на производительность и порядок вызова.
В реализации EventEmitter, такого как в Node.js, основная задача — эффективно хранить и управлять подписчиками (обработчиками) для различных событий. Ключевые требования: быстрый доступ к списку обработчиков по имени события, возможность добавлять и удалять обработчики, а также вызывать их в определенном порядке.
class EventEmitter {
constructor() {
this.events = new Map(); // Map для хранения событий
}
on(event, listener) {
if (!this.events.has(event)) {
this.events.set(event, []); // массив для порядка
}
this.events.get(event).push(listener);
}
emit(event, ...args) {
const listeners = this.events.get(event);
if (listeners) {
listeners.forEach(listener => listener(...args));
}
}
off(event, listener) {
const listeners = this.events.get(event);
if (listeners) {
this.events.set(event, listeners.filter(l => l !== listener));
}
}
}Массив предпочтителен, когда важен порядок вызова и частота добавления/удаления невысока. Set лучше, если требуется гарантировать уникальность и часто удалять обработчики. Map является стандартным выбором для хранения всех событий, так как обеспечивает быстрый доступ.
Вывод: Выбор структуры данных зависит от требований к порядку вызова, уникальности и производительности операций добавления/удаления. В большинстве реализаций EventEmitter используется комбинация Map и массива для баланса между скоростью и функциональностью.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию