我应该取消订阅Angular根组件中的可观察对象吗?

时间:2019-10-07 18:50:32

标签: angular rxjs observable

我的根(boot.apped)Angular(6.x)组件AppComponent中有一个Observable。
通常,我会使用生命周期钩子ngOnDestroy取消对destroy()调用的所有开放订阅。
由于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?
  }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

AppComponent.ngOnInit()中的一次性订阅可以

只要不重复创建新的订阅,就不必取消订阅AppComponent中的RXJS订阅。例如,只要订阅是一次性动作,就可以在ngOnInit的{​​{1}}中创建订阅。

根中提供的角度服务理想情况下应为Singleton Services

对于在根组件中创建的Angular服务,理想的情况是使用单例服务以确保应用程序中仅存在一个实例。

最佳做法

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

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

使用async

的示例
take(1)

请参见The Best Way To Unsubscribe RxJS Observables In The Angular Applications!