Angular Rxjs observable больше не срабатывает после отказа от подписки

Я слушаю сокет с помощью Observable и подписываюсь на него в одном из своих компонентов. Если я не отпишусь от него в ngOnDestroy, когда я снова перейду к этому компоненту, он сработает N раз (N — это количество раз, когда я переключаюсь обратно на этот компонент), но если я отпишусь от него в ngOnDestroy, тогда он будет слушать в первый раз, когда я перейти к этому компоненту, и когда я перейду к другому компоненту и вернусь обратно, он не сработает.

//in socket service
updateOrder() {
  if (!this.socket.connected)
    this.socket.connect();
  let observable = new Observable < any > (observer => {
    this.socket.on('test', (data) => {
      observer.next(data); //going into here
    });
    return () => {
      this.socket.disconnect();
    };
  })
  return observable;
}

В конструкторе слушающего компонента

this.orderSubscriber = this.socketService.updateOrder().subscribe(data => {
  console.log('socket fired', data);
})

ngOnDestroy() {
  this.orderSubscriber.unsubscribe();
}


person Bibek Gurung    schedule 01.06.2018    source источник
comment
Вероятно, вам нужно сделать что-то вроде socket.connect внутри updateOrder. Похоже, это делается где-то еще, и когда вы вызываете socket.disconnect, он больше никогда не выдает значения.   -  person Bunyamin Coskuner    schedule 01.06.2018
comment
эта строка вызывает проблему this.socket.disconnect();, то есть вы отключаете сокет при отмене подписки, поэтому в следующий раз, когда вы придете, вам нужно снова открыть соединение   -  person Pranay Rana    schedule 01.06.2018
comment
можешь поделиться кодом где-нибудь, будет полезно   -  person Pranay Rana    schedule 01.06.2018
comment
@BunyaminCoskuner @PranayRana Спасибо за ответ, я использовал if (!this.socket.connected) this.socket.connect(); в начале updateOrder, и теперь компонент срабатывает только один раз, как и предполагалось, но observer.next(data); внутри updateOrder вызывается так же, как и раньше. Это нормально?   -  person Bibek Gurung    schedule 04.06.2018
comment
@BibekGurung это, вероятно, нормально, потому что вы открываете сокет, который со временем приносит кучу данных. Он должен вызываться несколько раз.   -  person Bunyamin Coskuner    schedule 04.06.2018
comment
@BunyaminCoskuner, но я отправляю событие test только один раз с сервера.   -  person Bibek Gurung    schedule 04.06.2018
comment
Поместите свой обновленный код в вопрос и давайте проверим еще раз   -  person Bunyamin Coskuner    schedule 04.06.2018


Ответы (1)


Отвечая на мой собственный вопрос. Использование socket.removeListener('test') вместо socket.disconnect() решено. Спасибо людям, подтолкнувшим меня к проблеме.

//in socket service
updateOrder() {
  let observable = new Observable < any > (observer => {
    this.socket.on('test', (data) => {
      observer.next(data);
    });
    return () => {
      this.socket.removeListener('test')
    };
  })
  return observable;
}

person Bibek Gurung    schedule 04.06.2018