【发布时间】: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 这可能是正常的,因为您正在打开一个套接字,随着时间的推移会带来大量数据。它应该被多次调用。