对于可观察到的Angular路由器事件,为什么没有unsubscribe()?

Ala*_*ect 7 rxjs angular

在我的ngOnInit方法中,我这样订阅Router:

this.router.events.subscribe(
  event => {
    if (event instanceof NavigationEnd) this.clearMessages();
  }
);
Run Code Online (Sandbox Code Playgroud)

通常,对于HttpClient包之外的Observables,我在ngOnDestroy方法中调用unsubscribe,但是当我在此处尝试尝试取消订阅时,我发现this.router.events没有这种方法。我是否误解了这个Observable或其他内容?为什么取消订阅不会被执行?

Max*_*kyi 10

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

您调用的unsubscribe是订阅,而不是可观察的。并且this.router.events是可观察的,而不是订阅。因此,以下方法将起作用:

const subscription = this.router.events.subscribe(...);   
subscription.unsubscribe();
Run Code Online (Sandbox Code Playgroud)

  • 在 ngOnDestroy() {..} 中执行此操作 (2认同)

moh*_*adi 6

你是对的,一些 observables 不需要手动取消订阅,observables 像:

  1. 路由器、HTTP、HTTPClient,因为这些是单一的发射 observables,虽然是隐式的,并且
  2. 显式单发射可观测值(例如,有限的),例如 first()

也可以在这个 reddit 网站上找到类似的信息。这也意味着无需担心这些类中可观察对象的内存泄漏。

  • 我不会说来自 Router (Router + ActivatedRoute) 的 observables 是单发射 observables。它们可以根据事件、参数、查询参数等是否发生变化而多次发出。从这个 [stackblitz](https://stackblitz.com/edit/llai-router-cleanup?file=app%2Fcomponent-2%2Fcomponent-2.component.ts) 看起来像 ActivatedRoute observables 在组件被正确清理时摧毁了。但是你可以看到 `router.events` 没有清理。我认为这是故意的,因为在组件销毁后有 3 个导航事件。 (7认同)