如何在Observable.merge中阻止观察者



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

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();
});

但它并没有阻止CCD_ 3。

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

在这种情况下,mergeObserver不是可观察的,而是订阅。subscribe方法返回一个订阅。因此,将其重命名为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上调用unsubscribe,因为x是合并计时器的值。当其中一个计时器发出时,合并也会发出该值,它只是一个数字,没有取消订阅方法。

最新更新