Rxjs 在开始事件后处理事件流,并在结束事件发生时返回侦听

Rxjs 在开始事件后处理事件流,并在结束事件发生时返回侦听,rxjs,Rxjs,我正在研究的场景是由3个观察值组成的 StartObs:当我需要开始一系列处理时,此可观察数据会发出-发出的数据是我需要完成的处理的进程ID DoStuffObs:此可观察对象发出命令,我必须执行这些命令-我想在开始发出后立即开始收听此类可观察对象,我需要进程的进程ID来执行我的职责,使用函数doTheWork(命令,进程ID) EndObs:当我必须结束对某个进程ID的处理,并且必须返回以收听StartObs的下一次发射时,这个可观察到的发射 所以基本上是:开始,直到结束,然后回到听下一个开始

我正在研究的场景是由3个观察值组成的

StartObs:当我需要开始一系列处理时,此可观察数据会发出-发出的数据是我需要完成的处理的进程ID

DoStuffObs:此可观察对象发出命令,我必须执行这些命令-我想在开始发出后立即开始收听此类可观察对象,我需要进程的进程ID来执行我的职责,使用函数
doTheWork(命令,进程ID)

EndObs:当我必须结束对某个进程ID的处理,并且必须返回以收听StartObs的下一次发射时,这个可观察到的发射

所以基本上是:开始,直到结束,然后回到听下一个开始

还可以保证,在一次启动之后,迟早会有一个结束,并且不可能有两次启动之间没有结束,或者两次结束之间没有开始

前两个步骤可以通过
开关映射实现,如

StartObs
.switchMap(processId => DoStuff.map(command => ({command, processId})))
.tap(data => doTheWork(data.command, data.processId))
我不清楚的是如何处理EndObs


使用
takeUntil
的选项不起作用,因为我不想完成从StartObs开始的链,因为我必须回去聆听下一个过程的开始。

实际上,我认为
takeUntil()
repeat()
结合使用是最好的选择

当链使用
takeUntil()
完成时,由于
repeat()
,它将立即重新订阅,整个过程将重新开始

StartObs
  .switchMap(processId => DoStuff.map(command => ({command, processId})))
  .tap(data => doTheWork(data.command, data.processId))
  .takeUntil(EndObs)
  .repeat();