如何在 Observable.merge 中停止观察者?
How to stop observers in 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();
});
但它并没有停止Observable.merge
。
this.mergeObserver = Observable.merge(this.timers).subscribe(x => {
console.log(x);
});
在这种情况下,mergeObserver 不是可观察的,而是订阅。 subscribe 方法returns 订阅。所以将其重命名为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 是合并计时器产生的值。当其中一个计时器发出时,合并也会发出该值,它只是一个数字,没有取消订阅方法。
我有一个创建计时器的方法:
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
。
this.mergeObserver = Observable.merge(this.timers).subscribe(x => {
console.log(x);
});
在这种情况下,mergeObserver 不是可观察的,而是订阅。 subscribe 方法returns 订阅。所以将其重命名为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 是合并计时器产生的值。当其中一个计时器发出时,合并也会发出该值,它只是一个数字,没有取消订阅方法。