对于Angular路由器事件Observable,为什么没有unsubscribe()?

时间:2018-01-19 01:20:12

标签: angular rxjs

在我的 ngOnInit 方法中,我按照以下方式订阅了路由器:

this.router.events.subscribe(
  event => {
    if (event instanceof NavigationEnd) this.clearMessages();
  }
);

通常,对于 HttpClient 包之外的 Observables ,我在 ngOnDestroy 方法中调用取消订阅,但是当我试过这里,我发现 this.router.events 没有这样的方法。我错了或者 Observable 有什么不同吗?为什么取消订阅无法实施?

2 个答案:

答案 0 :(得分:6)

  

我发现this.router.events没有这样的方法

您在订阅上调用unsubscribe,而不是可观察对象。 this.router.events是可观察的,而不是订阅。所以以下方法可行:

const subscription = this.router.events.subscribe(...);   
subscription.unsubscribe();

答案 1 :(得分:2)

你是对的,一些可观察者不需要手动取消订阅,可观察者如:

  1. 路由器,HTTP,HTTPClient,因为它们是single emission observables,虽然是隐含的,但是
  2. 显式单发射可观测量(例如,有限),如first()
  3. 类似的信息也可以在this reddit site找到。这也意味着无需担心这些类中的可观察对象的内存泄漏。