RxJs竞赛功能-确保最先出现的获胜
我有两个不同的观测值,我们称它们为racer_1和racer2,当两个不同的事件发生时,它们会发出信号 如果出现racer_1,我必须执行功能逻辑doStuff_1(),如果出现racer_2,我必须执行doStuff_2() racer_1和racer_2不是相互排斥的,它们可以一个接一个地发生,但我想实现的是,如果其中任何一个发生,我只处理其中一个及其相关功能 显然,使用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(() =>
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
我想从操作员的帽子里再找一个把戏,但这很清楚,很好-谢谢