Rxjs 可观察的周期性暂停然后继续

Rxjs 可观察的周期性暂停然后继续,rxjs,rxjs6,Rxjs,Rxjs6,如何每15秒暂停观察,然后等待5秒,然后继续发射? 我举了一个例子: const digits = interval(1000); const pauser$ = interval(20000).pipe(mapTo(true)); pauser$.subscribe(item => console.log(`${new Date().toISOString()} pause fired`) ); const pauseStopper$ = pauser$.pipe( concat

如何每15秒暂停观察,然后等待5秒,然后继续发射? 我举了一个例子:

const digits = interval(1000);
const pauser$ = interval(20000).pipe(mapTo(true));
pauser$.subscribe(item =>
  console.log(`${new Date().toISOString()} pause fired`)
);
const pauseStopper$ = pauser$.pipe(
  concatMap(_ => timer(5000)),
  tap(() => console.log(`${new Date().toISOString()} pause stopped`)),
  mapTo(false)
);

const observable = merge(pauser$, pauseStopper$).pipe(
  startWith(false),
  switchMap(paused => (paused ? NEVER : digits))
);

observable.subscribe(
  item => console.log(`${new Date().toISOString()}: ${item}`),
  console.error,
  () => console.log("complete")
);
在第一次暂停循环之后,它的行为几乎接近于我所需要的。关于如何使这一点更清楚,有什么想法吗?

我创建了一个获取三个参数的函数:

  • source$:应该暂停/播放的可观察源
  • play$:继续发射源$observable
  • pause$:暂停源$observable

常量玩家=(源$:可观察,播放$:可观察,暂停$:可观察):可观察=>
合并(
吹管(
开关映射(()=>of(source$)
),
暂停$管道(
开关映射(()=>of(从不))
)
).烟斗(
开关映射(流=>流)
)
据我所知,此函数当前抛出一个错误。在我有自动取款机的短时间内,我无法修复错误。该错误是由暂停$switchMap中的(void 0)导致的。稍后我将尝试修复此错误。放弃该功能工作时出现的错误。

现在,您可以使用play$和pause$Observable发出播放/暂停:

const play$: Observable<void> = interval(20000).pipe(
  startWith(void 0),
  mapTo(void 0)
);

const pause$: Observable<void> = play$.pipe(
  switchMap(() => interval(15000).pipe(
    take(1)
  )),
  mapTo(void 0)
);


const player$ = player(source$, play$, pause$);
const play$:可观测=间隔(20000)。管道(
startWith(空0),
映射到(无效0)
);
常量暂停$:可观察=播放$.pipe(
开关映射(()=>间隔(15000)。管道(
采取(1)
)),
映射到(无效0)
);
常量玩家$=玩家(来源$,播放$,暂停$);

这能解决你的问题吗?如果解决方案有任何问题,请告诉我,我会尝试调整。

您所说的“暂停”到底是什么意思?应该删除暂停期间发出的事件,还是缓冲并在暂停结束后重新发出事件?就像我的示例中一样。我假设事件隐式地缓冲在进程内存中。提供的答案适合您吗?或者你有什么问题吗?写详细的答案需要付出相当大的努力,如果有效的话,我希望至少能得到反馈。很抱歉耽搁了,我不应该让它对我的案例有效,而是使用了另一种解决方案。您的示例有效,但每个暂停/播放周期都会重新订阅原始可观察对象,因此它会发出(1,2,3,4…1,2,3,4),而不是(1,2,3,4…5,6,7,8)。无论如何谢谢你!我将
player
函数中的
void 0
替换为
NEVER
,它可以工作,但暂停仅持续2秒。有没有办法让它更强大?我用NEVER更新了stackblitz和代码示例。从控制台输出中我看到,没有更多的错误,日志也将永远存在。因此,这应该是一个正在运行的解决方案。
const play$: Observable<void> = interval(20000).pipe(
  startWith(void 0),
  mapTo(void 0)
);

const pause$: Observable<void> = play$.pipe(
  switchMap(() => interval(15000).pipe(
    take(1)
  )),
  mapTo(void 0)
);


const player$ = player(source$, play$, pause$);