Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 取消订阅角度服务中的无限观测值的最佳方式是什么_Angular_Rxjs - Fatal编程技术网

Angular 取消订阅角度服务中的无限观测值的最佳方式是什么

Angular 取消订阅角度服务中的无限观测值的最佳方式是什么,angular,rxjs,Angular,Rxjs,在我们的AngularWebSocket服务中,为了告诉后端我们仍在监听,我们必须发送一种保持活动的信号 以下是我们的工作方式: @Injectable() 导出类WebsocketService{ 私有ws:CustomWebSocket; 构造函数(){ this.ws=newcustomwebsocket('ws://localhost'); 此.ws.onOpened(()=>{ console.info('WS-connected'); 这个。keepAlive(); }); } 公共

在我们的AngularWebSocket服务中,为了告诉后端我们仍在监听,我们必须发送一种保持活动的信号

以下是我们的工作方式:

@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()

我们是否必须手动取消订阅间隔,或者允许这个无限可观察序列是安全的

通常情况下,如果该服务将在应用程序的整个生命周期中使用,您就不必费心了,因为浏览器会为您清理。然而,有一些事情需要考虑:

  • 如果你的应用程序只加载在一个更大的应用程序中,这将不再是真的
  • 如果您曾经更改应用程序,使其仅在某些子组件上提供服务,那么您必须了解服务的实现细节,并记住调整应用程序以在其自身之后进行清理,以避免内存泄漏
遵循最小意外的原则,服务在被破坏后应该自行清理,所以我绝对建议这样做

我们没有Ngondestory生命周期挂钩,那么如何正确地执行它呢

这是一个流行的说法,但它是错误的<代码>Ngondestory也在服务上调用。直接来自:

当指令、管道或服务被销毁时调用的生命周期挂钩

所以你绝对可以做到:

@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)
是自完成的)。