RxJS:调用两个异步调用,返回传递条件的第一个,或者没有它们的特殊值

Han*_*tri 3 javascript asynchronous rxjs

使用RxJS,我想调用两个不同的异步操作,这些操作可能会也可能不会返回null.他们也可能无限期地完成任务.

我想实现以下目标:

  • 如果操作A返回值1,则立即返回值1
  • 如果操作B返回值2,则立即返回值2
  • 如果操作A和B都返回null,则返回null.

我想我可以完成前两个简单如下:

const bothOperations = merge(callA(), callB());
const firstSuccess = bothOperations.first(res => res !== null);
return firstSuccess;
Run Code Online (Sandbox Code Playgroud)

但是,我如何获得第三种可能性呢?

mar*_*tin 5

我想你可以这样做(我假设你正在使用RxJS 5.5):

merge(callA(), callB())
  .pipe(
    filter(v !== null),
    concat(of(null)),
    take(1),
  )
Run Code Online (Sandbox Code Playgroud)

take(1)运营商可以确保只有一个价值传递和concat(of(null))追加null两个源观测结束后.

请注意,如果两个源Observable都无限期地运行,那么它永远不会完成.timeout()但是你可以添加运算符.