代码之家  ›  专栏  ›  技术社区  ›  Picci

rxjs race函数-确保第一个出现的

  •  1
  • Picci  · 技术社区  · 7 年前

    我有两个不同的观测,我们称之为 小精灵 RACE2 ,当发生两个不同的事件时发出。

    如果 小精灵 我必须执行函数的逻辑 doToSuff1() 如果 Rrace2 发生我必须执行 doToSuff2() .

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

    很明显,使用 race RXJS的功能。

    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'))
        )
    )
    

    不幸的是也许会发生 小精灵 先发射 T0 doToSuff1() 启动同步执行,其结束于 T0+1000 .

    同时,在 T0+200 Rrace2 发射和执行 doToSuff2() 是很短的,所以它结束于 T0+300 .

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

    相反,我想看到的是 小精灵 从它第一次出现起就赢了,即使它的处理可能需要很长时间才能完成。

    有办法获得这种行为吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   martin    7 年前

    你只需重新排列操作程序,包装两个源观测到的初始排放,然后执行 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