我有2个不同的Observable,我们称之为 racer_1 和 racer2 ,当发生2个不同的事件时会发出这些信息。
如果 racer_1 发生,我必须执行功能 doStuff_1()的逻辑,如果 racer_2 发生,我必须执行 doStuff_2 ()
racer_1 和 racer_2 不是互相排斥的,它们可以一个接一个地出现,但我想要实现的是,如果它们中的任何一个发生,我只会处理那个与其相关的功能。
使用RxJ的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'))
)
)
函数似乎很明显。
public class LoginForm {
public List<String> checkBox;
public void setCheckBox(List<String> checkBox) {
this.checkBox = checkBox;
}
public List<String> getCheckBox() {
return checkBox;
}
public LoginForm() {
this.checkBox = new ArrayList<>();
}
不幸的是,虽然可能会发生 racer_1 首先在 t0 发出,而 doStuff_1()会启动同步执行,结束于 t0 +1000
与此同时, t0 + 200 racer_2 会发出并且 doStuff_2()的执行时间要短得多,因此它会以< EM> T0 + 300 。
在这种情况下,我看到 racer_2 &#34;赢得比赛&#34;及其排放量继续得到处理,而 racer_1 则完成。
相反,我希望看到 racer_1 胜出,因为它首先发生,即使它的处理可能需要很长时间才能完成。
有没有办法获得这种行为?
答案 0 :(得分:1)
您可以重新排序运算符并包装来自两个源Observable的初始排放,然后执行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