RxJS-仅在延迟期间其他未发射时发射

时间:2018-12-23 18:40:31

标签: javascript typescript rxjs

假设我有两个观测值。每当第一个可观察到的发射出光时,我要等待2秒钟,以查看在此期间另一个可观察到的物体是否发射出光。如果是,则不发射任何东西。如果否,则发出。

示例:

const start$ = this.events.pipe(
  delay(1000),
  takeUntil(theSecondObservable) // WHAT SHOULD BE HERE?
).subscribe((value) => {
  console.log(value);
});

4 个答案:

答案 0 :(得分:2)

当end $ observable发出并使用RxJS 6语法时,此解决方案无法完成。

const start$ = this.router.events.pipe(map(() => true));
const end$ = this.router.events.pipe(map(() => false));

merge(start$, end$)
  .pipe(debounceTime(2000), filter(value => value))
  .subscribe(value => console.log(value));

如果要过滤路由器事件,则可能不需要两个可观察对象。

this.router.events
  .pipe(debounceTime(2000), filter(event => event instanceof NavigationEnd))
  .subscribe(value => console.log(value));

答案 1 :(得分:0)

使用race operator

const start$ = race(this.events.pipe(delay(1000)), theSecondObservable).subscribe(value => /** ... */);

一旦其中一个可观察对象发出一个对象,另一个可观察对象将被忽略,只有“赢家”发出的值将被传递给订户。在您的订阅功能中,您可以执行一些逻辑以弄清楚您的价值来自哪个观察值。

答案 2 :(得分:0)

您是否对限制第一个观察者的发射或仅在最终结果中感兴趣?

您可以使用种族...

let r = race(observer1.pipe(delay(2000)), observer2)
 // r will emmit from observer1 only if observer2 didnt emmit, else it will emmit from observer2

答案 3 :(得分:0)

借助上述答案,我得以解决。但是,他们并没有完全回答我的问题,可能会有更好的方法。我的解决方案:

const end$ = this.router.events.pipe(
  map(() => false),
);
const start$ = this.router.events.pipe(
  map(() => true),
);

merge(
  end$,
  start$.pipe(
    switchMap(() => {
      return race(end$, of(true).pipe(delay(2000)));
    }),
    filter((value) => value === true) // this really works only with booleans, not sure how I'd do it with more 
                                                            // complex objects
  )
).subscribe((value) => {
  console.log(value);
});