首页 > 解决方案 > 我应该取消订阅根 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?
  }
}

谢谢!

标签: angulartypescriptrxjsobservable

解决方案


AppComponent.ngOnInit() 中的一次性订阅没问题

Angular 中的 RXJS 订阅AppComponent不需要取消订阅,只要不重复创建新的订阅即可。例如,如果订阅是在其中创建ngOnInit的,AppComponent只要它们是一次性操作就可以了。

根中提供的 Angular 服务最好是单例服务

对于在根组件中创建的 Angular 服务,最好使用单例服务来确保应用程序中只存在一个实例。

最佳实践

虽然在根组件中拥有未取消订阅的订阅通常是可以的,但建议遵循管理订阅的最佳实践。

  • take(1)- 对于仅在应用程序启动期间发生一次的订阅,使用 RXJStake(1)运算符,它具有自动取消订阅的好处。
  • asyncPipe - 在后台处理 RXJS 订阅并自动取消订阅。

使用示例take(1)

constructor(private dataSvc: DataService) { }

ngOnInit() {
  this.dataSvc.myObservable.pipe(take(1)).subscribe((val) => {
    // do stuff
  });
}

查看Angular 应用程序中取消订阅 RxJS Observables 的最佳方式!


推荐阅读