有条件地将两个流与RxJ合并

时间:2018-11-20 08:59:10

标签: angular typescript rxjs

我进行了两次服务器调用,以在流中获得一些响应。但是,如果第一个调用返回了一些数据,则我不想执行第二个调用。我找不到合适的运算符或运算符组合来在第一个请求成功时取消第二个请求(我不想抛出错误)。

我也尝试了defaultIfEmpty,但看起来像是黑客,我不喜欢它。

我创建了一个StackBlitz示例,您可以检查它here,但是我不确定这是否是一个好习惯。所以基本上我需要有条件的concatMap。

如果您知道如何在不创建新操作员的情况下使用可用的操作员,那么我真的很想听听您的方法。

谢谢。

2 个答案:

答案 0 :(得分:3)

如果您的第一个异步请求的类型为Observable<T>,并且仅在成功时返回一个值T,否则将在不发出值的情况下完成返回,您可以使用简单的.concat()来代替:

firstAsyncCall()
  .concat(secondAsyncCall())
  .take(1)

如果.take(1)返回(至少)1个值,则secondAsyncCall()将确保不会调用firstAsyncCall

答案 1 :(得分:0)

当值不适合您时,使用filter停止流:

https://stackblitz.com/edit/typescript-1uvrgf?file=index.ts

const interval$ = interval(100);

interval$.pipe(
  filter(val => val % 10 === 0),
  take(10),
).subscribe(val => console.log(val));