RxJs竞赛功能-确保最先出现的获胜

RxJs竞赛功能-确保最先出现的获胜,rxjs,Rxjs,我有两个不同的观测值,我们称它们为racer_1和racer2,当两个不同的事件发生时,它们会发出信号 如果出现racer_1,我必须执行功能逻辑doStuff_1(),如果出现racer_2,我必须执行doStuff_2() racer_1和racer_2不是相互排斥的,它们可以一个接一个地发生,但我想实现的是,如果其中任何一个发生,我只处理其中一个及其相关功能 显然,使用RxJs的race函数就是这样 race( racer_1.pipe( tap(() =>

我有两个不同的观测值,我们称它们为racer_1racer2,当两个不同的事件发生时,它们会发出信号

如果出现racer_1,我必须执行功能逻辑doStuff_1(),如果出现racer_2,我必须执行doStuff_2()

racer_1racer_2不是相互排斥的,它们可以一个接一个地发生,但我想实现的是,如果其中任何一个发生,我只处理其中一个及其相关功能

显然,使用RxJs的
race
函数就是这样

race(
    racer_1.pipe(
        tap(() => doStuff_1()),
        finalize(() => console.log('racer 1 completed'))
    ),
    racer_2.pipe(
        tap(() => doStuff_2()),
        finalize(() => console.log('racer 2 completed'))
    )
)
不幸的是,racer_1首先在t0发射,而doStuff_1()开始同步执行,并在t0+1000结束

同时,在t0+200时,racer_2发射,doStuff_2()的执行时间短得多,因此在t0+300处结束

在这种情况下,我看到的是racer_2“赢得比赛”,其排放继续得到处理,而racer_1完成

相反,我希望看到的是racer_1从它第一次出现起就获胜,即使它的处理可能需要很长时间才能完成


有没有办法获得这样的行为?

您可以重新排序运算符,将两个源观测值的初始排放量包装起来,然后执行
doStuff_1
doStuff_2

race( // wrap emissions with tmp objects
    racer_1.pipe(map(result => { type: 'racer1', result })),
    racer_2.pipe(map(result => { type: 'racer2', result })),
  )
  .tap(({ type, result }) => type === 'racer1'
    ? doStuff_1() 
    : doStuff_2()
  )
  map(({ type, result }) => result) // unwrap the object

我想从操作员的帽子里再找一个把戏,但这很清楚,很好-谢谢