Angular 取消订阅角度服务中的无限观测值的最佳方式是什么
在我们的AngularWebSocket服务中,为了告诉后端我们仍在监听,我们必须发送一种保持活动的信号 以下是我们的工作方式:Angular 取消订阅角度服务中的无限观测值的最佳方式是什么,angular,rxjs,Angular,Rxjs,在我们的AngularWebSocket服务中,为了告诉后端我们仍在监听,我们必须发送一种保持活动的信号 以下是我们的工作方式: @Injectable() 导出类WebsocketService{ 私有ws:CustomWebSocket; 构造函数(){ this.ws=newcustomwebsocket('ws://localhost'); 此.ws.onOpened(()=>{ console.info('WS-connected'); 这个。keepAlive(); }); } 公共
@Injectable()
导出类WebsocketService{
私有ws:CustomWebSocket;
构造函数(){
this.ws=newcustomwebsocket('ws://localhost');
此.ws.onOpened(()=>{
console.info('WS-connected');
这个。keepAlive();
});
}
公共keepAlive(){
可观察的.interval(10000).subscribe((勾号:number)=>this.ws.send('keep-alive');
}
}
1/此服务被注入我们的主app.module.ts中。我们是否必须手动取消订阅间隔,或者允许这个无限可观察序列是安全的
2/作为一个一般性问题,如果我们必须取消订阅,由于订阅是在一个服务中进行的,那么正确的方式是什么?我们没有
ngondstroy
lifecycle钩子,因此如何正确地执行它?该服务的问题是,没有一个可供您取消订阅的on-destroy方法,它确实需要取消订阅,只有http请求是自动关闭的(http服务为您执行此操作)
我会让你的WebsocketService向你的主要应用程序组件返回一个冷可观察的
为主应用程序组件中的可观察对象创建占位符
IE:ngUnsubscribe:Subject=新主题()
从您的服务中订阅您的可观察内容。
IE:WebsocketService.keepAlive().takeUntil(this.ngUnsubscribe.subscribe()
在主应用程序组件中的onDestroy事件中,我将调用这个.ngUnsubscribe.next();
this.ngUnsubscribe.complete()
我们是否必须手动取消订阅间隔,或者允许这个无限可观察序列是安全的
通常情况下,如果该服务将在应用程序的整个生命周期中使用,您就不必费心了,因为浏览器会为您清理。然而,有一些事情需要考虑:
- 如果你的应用程序只加载在一个更大的应用程序中,这将不再是真的
- 如果您曾经更改应用程序,使其仅在某些子组件上提供服务,那么您必须了解服务的实现细节,并记住调整应用程序以在其自身之后进行清理,以避免内存泄漏
@Injectable()
导出类WebsocketService实现OnDestroy{
私有ws:CustomWebSocket;
private destroy$=新主题();
构造函数(){
this.ws=newcustomwebsocket('ws://localhost');
此.ws.onOpened(()=>{
console.info('WS-connected');
这个。keepAlive();
});
}
公共keepAlive(){
可观测间隔(10000)
.takeUntil(此.destroy$)
.subscribe((勾选:number)=>this.ws.send('keep-alive');
}
公共恩格德斯特罗(){
this.destroy$.next();
此.destroy$.complete();
}
}
您最终提供的方法没有错,但这个答案仍然包含一些错误的说法。服务确实有一个onDestroy钩子,并且说只有HTTP请求是自完成的是一个巨大的过度概括(Observable.of(42)
是自完成的)。