Denis_maker
@Denis_maker
✔ Инженер-программист. Веду весь спектр разработки

Как удалить конкретный слушатель socket.io на клиенте?

Socket (на клиенте) инициализируется на нескольких страницах:
this.socket.on('server-response', data => { })
Что нужно написать в ngOnDestroy(){} или в ionViewDidLeave() {}, чтобы отписаться от слушателя только на этой странице, которую покидаю?

Опишу проблему подробно: Есть страница, request.page.ts , которая используется многократно. Отображаемые на ней данные зависят от id, например: "/home/request;id=24" и "/home/request;id=175".
При выходе со страницы мне нужно уничтожить её. Пытаюсь сделать это несколькими вариантами:
goBack(){
    this.navCtrl.navigateRoot('/home');
    this.router.navigate(['/home'], {replaceUrl: true})
    this.location.back();
}

Допустим я выхожу со страницы "/home/request;id=24". После такого выхода история url-перемещений как бы удаляется, я не могу вернуться на неё путём нажатия на кнопку "назад", но сокеты на ней и разные функции продолжают работать. Если я открою эту же страницу, "/home/request;id=24" или новую "/home/request;id=175", компонент инициализируется заново, и получается, что та закрытая страница существует в фоне и функции на ней продолжают отрабатываться..
Соответственно, если страница не уничтожается, от событий на ней нужно отписаться (Нагуглиг про unsubscribe).
У socket.io на клиенте есть это:
this.socket.removeListener('server-response');
Но она отписывает не конкретную страницу, а все эти слушатели 'server-response', в том числе на других страницах.. Соответственно, что нужно написать в ngOnDestroy(){} или в ionViewDidLeave() {}, чтобы отписаться от слушателя только на этой странице, которую покидаю?
  • Вопрос задан
  • 403 просмотра
Решения вопроса 1
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
Чет у вас каша.
Подписка на сокет это не дело конкретной страницы, это задача для логики на уровне всего приложения. Если бизнес-задача такова что нужно открыть подписку при открытии страницы, то страничка должна извещать сервис о своей активности.

Допустим я выхожу со страницы "/home/request;id=24". После такого выхода история url-перемещений как бы удаляется, я не могу вернуться на неё путём нажатия на кнопку "назад"

router.navigate оставляет историю перемещений, если не указано дополнительных опций. location трогать не надо вообще.

Socket (на клиенте) инициализируется на нескольких страницах:
this.socket.on('server-response', data => { })

Сделовало бы сделать в каком-нибудь сервисе
serverResponse = new Observable(observer => {
  this.socket.on('server-response', data => ovserver.next(data));
  return () =>  this.socket.removeListener('server-response');
}).pipe(share());


И потом на странице просто подписываешься на этот поток, а в ngOnDestroy() отписываешься.

Тут нет обработки ошибок соединения или дисконнекта, советую разобраться со всем самому. Возможно пригодится fromEvent или fromEventPattern
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
w3bsmes
@w3bsmes
Куратор тега «Глупые вопросы»
Как ответил уже Антон Швец, достаточно лишь socket.removeListener('server-response')
Ответ написан
Ваш ответ на вопрос

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

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