angular - 我应该取消订阅根 Angular 组件中的 observables 吗?
问题描述
我的根(引导)Angular(6.x)组件中有一个 Observable AppComponent
,.
通常,我会在使用生命周期钩子的 destroy() 调用时取消订阅任何打开的订阅,ngOnDestroy
.
由于 AppComponent 是应用程序的根,因此永远不会被销毁(除非整个应用程序被销毁),我是否还需要实现 ngOnDestroy 并且我是否需要为取消订阅而烦恼?
我一直无法找到这个看似常见的确切场景的答案。
例子:
export class AppComponent implements OnInit, OnDestroy {
private tokenSubscription: Subscription;
constructor(private dataSvc: DataService) { }
ngOnInit() {
this.tokenSubscription = this.dataSvc.myObservable.subscribe((val) => {
// do stuff
});
}
ngOnDestroy() {
this.tokenSubscription.unsubscribe(); // Do I need this in root component?
}
}
谢谢!
解决方案
AppComponent.ngOnInit() 中的一次性订阅没问题
Angular 中的 RXJS 订阅AppComponent
不需要取消订阅,只要不重复创建新的订阅即可。例如,如果订阅是在其中创建ngOnInit
的,AppComponent
只要它们是一次性操作就可以了。
根中提供的 Angular 服务最好是单例服务
对于在根组件中创建的 Angular 服务,最好使用单例服务来确保应用程序中只存在一个实例。
最佳实践
虽然在根组件中拥有未取消订阅的订阅通常是可以的,但建议遵循管理订阅的最佳实践。
take(1)
- 对于仅在应用程序启动期间发生一次的订阅,使用 RXJStake(1)
运算符,它具有自动取消订阅的好处。async
Pipe - 在后台处理 RXJS 订阅并自动取消订阅。
使用示例take(1)
constructor(private dataSvc: DataService) { }
ngOnInit() {
this.dataSvc.myObservable.pipe(take(1)).subscribe((val) => {
// do stuff
});
}
推荐阅读
- java - Hibernate 可以将子选择中的 1:M 连接的结果集映射到具有子集合的父级吗?
- arrays - 在 MongoDB 中查询数组
- excel - 如何在 Excel 2010 中设置“分层条件格式”?
- bash - 在 macOS 中批量重命名文件
- firebase - Firebase 函数 - 未调用函数
- django - 问题对象需要有一个主键值才能访问它们的标签
- c - 使用 PWM PSoC 的直流电机速度和方向
- azure-iot-edge - IoT Edge 遥测未显示在 IoT Central 中
- spring - 通过 SpringBoot 将数据摄取到 ML
- flutter - Flutter PWA Indexeddb_shim