提问者:小点点

如何取消订阅角度组件中的多个可观察对象?


取消订阅角度中的多个可观察的最佳策略是什么?为了清楚起见,当应用程序不大并且不需要诸如ngrx之类的解决方案时,我使用这种方法,在这种情况下,这种解决方案会过于繁琐。

目前,我使用订阅实例来添加所有订阅,之后当组件被销毁时,我调用取消订阅方法。但我也看到了使用rxjs中的带直到的替代方案。

export class MyComponent implements OnInit, OnDestroy {

  $firstObservable: Observable<number> = timer(0, 1000);
  $secondObservable: Observable<number> = timer(0, 1000);

  private _subscriptions = new Subscription();

  constructor() { }

  ngOnDestroy(): void {
    this._subscriptions .unsubscribe();
  }

  ngOnInit(): void {
    this._subscriptions .add(
      this.$firstObservable.subscribe(console.log));

    this._subscriptions .add(
      this.$secondObservable.subscribe(console.log));
  }

}

最好的解决办法是什么?


共3个答案

匿名用户

我建议你使用带直到()管道运算符:https://www.learnrxjs.io/operators/filtering/takeuntil.html

这样,您可以创建一个主题,它在ngOnDestroy上发出值并一次取消订阅多个订阅

 unsubscribeSignal: Subject<void> = new Subject();

 $firstObservable: Observable<number> = timer(0, 1000);
 $secondObservable: Observable<number> = timer(0, 1000);

 ngOnInit() {

    this.$firstObservable
    .pipe(
       takeUntil(this.unsubscribeSignal.asObservable()),
    )
    .subscribe(result => {});

    this.$secondObservable
    .pipe(
       takeUntil(this.unsubscribeSignal.asObservable()),
    )
    .subscribe(result => {});

  }

  ngOnDestroy(){
    this.unsubscribeSignal.next();
    // Don't forget to unsubscribe from subject itself
    this.unsubscribeSignal.unsubscribe();
  }

匿名用户

我很失望人们甚至没有提到async管道。

它非常强大,让您无需担心订阅和使用推送检测策略。

要使用它,只需从TS中删除订阅,并将值分配给将被键入为可观察对象的变量。

只看代码精简和简单(不知道是不是单词,但有点不在乎)

export class MyComponent {
  firstObservable$: Observable<number> = timer(0, 1000);
  secondObservable$: Observable<number> = timer(0, 1000);

  combination$ = combineLatest(this.firstObservable$, this.secondObservable$)
    .pipe(tap(() => console.log()));
}

用你的超文本标记语言

<ng-container *ngIf="combination$ | async">
  Observables are being observed.
</ng-container>

(即使它不适合你的问题示例,你已经可以看到它是如何干净的

最好的部分是,您不必再担心内存泄漏。Angular负责所有订阅,让您只关心您的代码(这是一个好的框架应该做的事情)。

匿名用户

Subscribe类有一个add方法,它将多个订阅添加到一个中,然后可以一次取消订阅。

subscription1 = observable.subscribe(
    // next, err, complete etc
);

subscription2 = observable.subscribe(
    // next, err, complete etc
);

添加多个订阅

subscription1.add(subscription2);

一次取消订阅所有订阅。

subscription1.unsubscribe();