RxJS:当源之间的延迟发出的时间过长时,发射值

时间:2019-08-23 12:58:33

标签: rxjs

我有一个以1Hz发射的流。有时,发射的项目之间会有几秒钟的延迟,比如说10秒钟。我想创建一个订阅源的observable,并且每次项目之间的延迟过长(例如5s)时,它将发出另一种类型的项目。但是,当源再次发出正常值时,应发出源。

-O-O-O-O-O----------O-O-O-O---|---> source
-O-O-O-O-O----X-----O-O-O-O---|---> observable

我认为,在这种情况下,我可以使用timeoutWith(delay,of(X)),但这会从源中取消订阅,从而丢失了流的其余部分。

当我使用switchMap(O => of(O).timeoutWith(delay, of(x))拥有一次性的Os流时,它还没有超时,因为尚未创建内部可观察对象。

有什么想法吗?

最终解决方案

这是解决方案,最终是我需要的:

this.sensorChanged
    .pipe(
      mapTo(SensorEvent.SIGNAL_FOUND),
      startWith(PositioningEvent.SIGNAL_UNAVAILABLE),
      switchMap(x => concat(of(x), timer(5000).pipe(mapTo(PositioningEvent.SIGNAL_LOST)))),
      distinctUntilChanged()
    )

缺少的链接是startWith(),它阻止了switchMap发出。

1 个答案:

答案 0 :(得分:1)

未经测试,但这可以解决问题:

const result$ = source$.pipe(
  switchMap(o => concat(of(o), timer(5000).pipe(mapTo(x))))
);