在 non-Component/Directive class 中取消订阅 Observable

Unsubscribing from Observable in a non-Component/Directive class

我在 Angular 阅读了大量关于取消订阅 Observable 的帖子,他们都提到需要在 components/directives 中取消订阅。

所以我的问题是:

我们需要在 non-component/directive class 中取消订阅 Observable 吗?在服务或基本上任何其他 class 包含订阅 Observables?

您取消订阅组件,因为当您从 DOM 中删除它们时(例如使用 *ngIf 或其他),RxJS 链将保存对您在那里创建的观察者的引用。从而引入内存泄漏。

通常您不必取消订阅服务,因为它们在您的应用程序的整个生命周期中都存在。

但是,在 Angular 中,您可以创建一个组件,例如仅向其后代提供不同的服务实例(这意味着您的应用中可能有同一服务的多个实例 class ).在这种情况下,您应该手动取消订阅(可能是在销毁定义它们的组件时)。

我认为指出取消订阅的重要性很重要。从来没有必要取消订阅流,但可以提高性能,在某些情况下,取消订阅作为功能的一部分很重要。

同样重要的是,取消订阅是消费者的责任。流 "force" 消费者取消订阅的唯一方法是完成或出错。

在 Angular 服务中,如果您最终订阅了一个流,取消订阅是一种很好的做法,除非您有充分的理由继续收听。这是一个(人为的)示例:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';

@Injectable()
export class MyService {
  constructor( private session: Session ) { }

  isLoggedIn(): Observable<boolean> {

    return Observable.create( observer => {
      const innerSubscription = this.session.subscribe( session => {
        if ( session.user.isLoggedIn ) {
          observer.next( true );
        }
        observer.next( false );
      });

      return function unsubscribe() {
        innerSubscription.unsubscribe(); // this "cleans up" our subscription.
      };
    });

  }
}

还有其他更好的方法来编写此代码,这只是一个示例。所以在这种情况下,我们有一个非 Component/Directive 订阅会话。每次会话更改时,我们都会查看用户是否登录并通知我们的侦听器,如果他们 are/aren 没有。如果每个人都取消订阅 us,除非我们(服务)明确取消订阅,否则我们仍会收听 this.session