RxJs比赛功能 - 确保第一个获胜

时间:2018-06-18 14:11:08

标签: rxjs

我有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 胜出,因为它首先发生,即使它的处理可能需要很长时间才能完成。

有没有办法获得这种行为?

1 个答案:

答案 0 :(得分:1)

您可以重新排序运算符并包装来自两个源Observable的初始排放,然后执行doStuff_1doStuff_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