在内部可观察到的地方使用takeUntil

时间:2019-10-01 14:29:00

标签: rxjs reactive-programming

如何更好地编写此代码段?

我想要实现的是每次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将不再处理,也不会创建另一个计时器。

1 个答案:

答案 0 :(得分:2)

您可以重组运营商:

this.eventGenerator$.pipe(
  switchMap(() => timer(0, 1000).pipe(
    switchMap(() => this.service.getSomething()),
    takeUntil(this.anotherEvent$),
  ),
).subscribe(...);