如何在Observable.merge中停止观察者?

问题描述 投票:0回答:1

我有一个创建计时器的方法:

 create(options: any) {
    return timer(0, 1000).pipe(
      map(() => {
        return options;
      }),
      takeWhile(() => new Date() < options.finishDate)
    );
  }

然后将此计时器添加到Observables的数组this.timers

this.timers.push(this.create({finishDate: new Date()}))

当我合并观察者时:

this.mergeObserver = Observable.merge(this.timers).subscribe(x => {
   console.log(x);
});

尽管计时器已完成,但我仍看到console.log(x);继续工作。

为什么?以及如何停止数组中的所有计时器?

我可以在这里退订:

 Observable.merge(this.timers).subscribe(x => {
   x.unsubscribe();
});

但是它不会停止Observable.merge

javascript rxjs rxjs5 rxjs6
1个回答
0
投票
this.mergeObserver = Observable.merge(this.timers).subscribe(x => {
   console.log(x);
});

在这种情况下,mergeObserver不是可观察的,而是预订。 subscription方法返回一个订阅。因此,将其重命名为mergeSubscription并在此对象上调用unsubscribe就是如何取消订阅。

如果要引用可观察的对象,则需要在引用后订阅。

this.mergeObserver = Observable.merge(this.timers);

this.mergeSubscription = this.mergeObserver.subscribe(x => {
   console.log(x);
});

然后您取消订阅mergeSubscription对象。

Observable.merge(this.timers).subscribe(x => {
   x.unsubscribe();
});

在这里您不能在x上取消订阅,因为x是合并计时器发出的值。当其中一个计时器发出时,合并也会发出该值,它只是一个数字,没有取消订阅的方法。

© www.soinside.com 2019 - 2024. All rights reserved.