IgorPI
@IgorPI

Как удалить одного подписчика, если одинаковые имена?

Коллеги, приветствую.

export type EventHandler = (...args: any[]) => void
interface TH {
  event: string;
  handler: EventHandler;
}

export class EventEmitter {
  private _handlers: TH[] = []

  public emit (event: string, data: any) {
    this._handlers.forEach((th) => {
      if (event === th.event) {
        th.handler(data)
      }
    })
  }

  public on (event: string, handler: EventHandler) {
    this._handlers.push({
      event,
      handler
    })
  }

  public off (event: string) {
    while (true) {
      const index: number = this._handlers.findIndex((th: TH) => th.event === event)
      if (index > -1) {
        this._handlers.splice(index, 1)
      } else {
        break
      }
    }
  }
}


const emiter: EventEmitter  = new EventEmitter()
  emiter.on('sex', handler)
  emiter.on('sex', handler)


Можно ли удалить один из них?
Или как сделать правильно.

Например, как это сделано в Vue.
В нем есть on и off
Можно подписать сразу два обработчика на одно событие, но потом удалить один из них используя метод off
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 1
Robur
@Robur
Знаю больше чем это необходимо
очевидно что для этого вам надо использовать что-то иное, чем имя.
либо это ссылка на хендлер, тогда код будет вида emiter.off(event, handler)
либо, как это делается много где, emiter.on() возвращает функцию - отписывалку, тогда будет
const off1 = emiter.on('aaa', handler1)
const off2 = emiter.on('aaa', handler2)
off1()


Например, как это сделано в Vue.
В нем есть on и off

в нем - первый вариант:
https://github.com/vuejs/vue/blob/dev/src/core/ins...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы