Sobes.tech
Back to questions
Middle+
4

Если нужно поддерживать дублирующиеся обработчики, как бы вы реализовали отписку? Какие минусы у реализации через массив с фильтрацией?

Companies where asked
АэрофлотАэрофлот

Answer from AI

sobes.tech 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);
    }
  }
}

Такой подход позволяет точно и эффективно отписываться от конкретных обработчиков, даже если они дублируются.