removeAllListeners () не удаляет слушателей вообще? (Socket.IO) - PullRequest
4 голосов
/ 16 апреля 2020

Я использую socket.io-client в своем Angular 8 приложении.

Я использую сервис, который выглядит следующим образом:

private socket: SocketIOClient.Socket;
private _alertsObservable: Observable<Alert> = Observable.create();

constructor(channelService : MyChannelService) {
    this.socket = io(environment.socketServer);
  }

refreshAlertsObservable() {
    console.log('This prints once when called')'
    this.socket.removeAllListeners();
    this._alertsObservable = Observable.create(observer => {
      channelService.channelArray.forEach(
        channel => {
          this.socket.on(channel.number.toString(), alert => {
            console.log('This prints multiple times')'
            observer.next(alert);
          });
        }
      )
    });
  }

Я работаю refreshAlertsObservable() всякий раз, когда я обнаруживаю изменение, вносимое в channelService.

Всякий раз, когда я делаю this.socket.on()..., создается впечатление, что он добавляет несколько слушателей к channel.number, что, как я понимаю, по своему замыслу). Вот почему я запускаю this.socket.removeAllListeners(); заранее. Тем не менее, похоже, что это не работает, потому что «This prints multiple times» продолжает печататься кратно после отправки сообщения. Я также попытался заменить on() на addEventListener(), и поведение такое же.

Спасибо

1 Ответ

0 голосов
/ 22 апреля 2020

RemoveAllListeners ожидают массив имен событий, которые вы слушали. Попробуйте сохранить прослушиватели, созданные в массиве, и передать то же самое функции. Можете ли вы попробовать следующий способ:

socket.removeAllListeners([eventName])

Для получения дополнительной информации, пожалуйста, обратитесь к документации Socket

Существуют и другие похожие методы, такие как off, removeListener et c Вы можете попробовать.

--- EDIT ---

Или Если ваш "сокет" экземпляра сокета в кодах является оберткой, которую возвращает angular, которая может иметь только функции on и emit, пожалуйста, попробуйте распечатать объект и вызов его с помощью метода ниже:

socket.getSocket().removeAllListeners();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...