Middle+
Als je dubbele handlers moet ondersteunen, hoe zou je je afmelding implementeren? Wat zijn de nadelen van implementatie via een array met filtering?
sobes.tech AI
Antwoord van AI
Если нужно поддерживать дублирующиеся обработчики и реализовать отписку, можно хранить обработчики в массиве (списке) и при отписке удалять нужный обработчик.
Минусы реализации через массив с фильтрацией:
- Производительность: При удалении обработчика приходится создавать новый массив без этого обработчика (фильтрация), что может быть дорого при большом количестве обработчиков.
- Проблемы с дубликатами: Если обработчики дублируются, удаление по значению может удалить все совпадения, а не только конкретный экземпляр.
- Сложность идентификации: Без уникальных идентификаторов сложно точно удалить нужный обработчик.
Как улучшить:
- Использовать структуру данных, которая хранит обработчики с уникальными ID (например, Map или объект с ключами).
- При добавлении возвращать токен или функцию отписки, которая удалит именно этот обработчик.
Пример на JavaScript:
class EventEmitter {
constructor() {
this.handlers = new Map();
this.nextId = 0;
}
on(handler) {
const id = this.nextId++;
this.handlers.set(id, handler);
return () => this.handlers.delete(id); // функция отписки
}
emit(event) {
for (const handler of this.handlers.values()) {
handler(event);
}
}
}
Такой подход позволяет точно и эффективно отписываться от конкретных обработчиков, даже если они дублируются.