【问题标题】:Angular Rxjs observable wont fire again after unsubscribed取消订阅后,Angular Rxjs observable 不会再次触发
【发布时间】:2018-06-01 06:26:34
【问题描述】:

我正在使用 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();
}

【问题讨论】:

  • 您可能需要在updateOrder 中执行某种socket.connect。看起来它是在其他地方完成的,当您调用 socket.disconnect 时,它永远不会再次发出值。
  • 这条线导致问题this.socket.disconnect(); 即您在取消订阅时正在断开套接字,所以下次您需要再次打开连接
  • 你能把你的代码分享一下吗,会有帮助的
  • @BunyaminCoskuner @PranayRana 谢谢你的回复,我在updateOrder 的开头使用了if (!this.socket.connected) this.socket.connect();,现在该组件只按预期触发一次,但observer.next(data); 内部updateOrder 是像以前一样被称为。正常吗?
  • @BibekGurung 这可能是正常的,因为您正在打开一个套接字,随着时间的推移会带来大量数据。它应该被多次调用。

标签: angular socket.io rxjs6


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2016-07-07
    • 2018-10-03
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多