如何更好地编写此代码段?
我想要实现的是每次eventGenerator$
发出任何东西时都开始一个新的轮询(并丢弃以前的轮询),但是其他通知者(anotherEvent$
)也可以丢弃该轮询
this.eventGenerator.asObservable()
.subscribe(event => {
if (this.polling$) {
this.polling$.unsubscribe();
}
this.polling$ = timer(0, 1000)
.pipe(
switchMap(() => this.service.getSomething())
takeUntil(this.anotherEvent$)
)
.subscribe();
})
基本规则之一是不要订阅subscribe()方法内的其他订阅。
为此,switchMap
运算符听起来像是链接它的一个不错的选择,但是如果使用takeUntil
且发出anotherEvent$
,它将取消整个订阅的订阅,而不仅是轮询部分,因此将取消订阅eventGenerator
将不再处理,也不会创建另一个计时器。
答案 0 :(得分:2)
您可以重组运营商:
this.eventGenerator$.pipe(
switchMap(() => timer(0, 1000).pipe(
switchMap(() => this.service.getSomething()),
takeUntil(this.anotherEvent$),
),
).subscribe(...);