使用 takeUntil 操作符管理 Angular 组件的订阅

在 Rxjs 中,可以使用 takeUntil 来控制另外一个 Observable 对象数据的产生。使用 takeUntil,上游的数据直接转手给下游,直到takeUntil的参数吐出一个数据或者完结。

就像一个水龙头开关,一开始是打开的状态,上游的数据一开始直接流到下游,只要 takeUntil 一旦触发吐出数据,水龙头立刻关闭。

利用这点,可以在订阅时时,在管道中添加 takeUntil,在组件销毁时吐出数据,这样这些订阅就会立刻关闭,也就达到回收内存的作用。

改造之前:

export class ExampleComponent implements OnInit, OnDestroy {
  subscription1: Subscription;
  subscription2: Subscription;

  ngOnInit(): void {
    this.subscription1 = observable1.subscribe(...);
    this.subscription2 = observable2.subscribe(...);
  }

  ngOnDestroy() {
    this.subscription1.unsubscribe();
    this.subscription2.unsubscribe();
  }
}

改造之后:

export class ExampleComponent implements OnInit, OnDestroy {
  destroy$: Subject = new Subject();

  ngOnInit(): void {
    observable1
      .pipe(takeUntil(this.destroy$))
      .subscribe(...);
    observable2
      .pipe(takeUntil(this.destroy$))
      .subscribe(...);
  }

  ngOnDestroy() {
    this.destroy$.next(true);
    this.destroy$.complete();
  }
}

值得注意的是,takeUntil必须是pipe中最后一个操作符,防止在pipe中其他的操作符产生新的流而导致失效。

总结

对比下来,你会发现takeUntil操作符会清晰简洁很多,你只需要把takeUntil(this.destroy$)加入到想要组件销毁时停止订阅的管道,即可统一管理。

你可能感兴趣的:(angular.js,javascript,前端)