Rxjs One Observable进入另一个

时间:2017-06-16 16:25:35

标签: rxjs observable

我有一个相当笨重的代码集,其中一个observable的数据被输入另一个,如:

let source = this.myService.getFoo()
   .subscribe(result => {
      let source2 = this.myService.getMoo(result)
         .subscribe(result2 => { // do stuff });
   });

我知道有很多方法可以组合和链接,但我需要从源代码中获取数据并将其输入source2。订阅的嵌套看起来很糟糕,我很确定有更好的方法来做到这一点。

谢谢!

2 个答案:

答案 0 :(得分:13)

为了将Observable发出的项转换为另一个Observable,您可能希望使用flatMap运算符。它创建一个内部Observable并将其结果平移到外部流。

fputc()

以下是一些您可以使用的平面运算符,其行为方式不同:

  • flatMap / mergeMap - 立即为任何源项创建一个Observable,所有以前的Observable都保持活动
  • concatMap - 在创建下一个Observable之前等待上一个Observable完成
  • switchMap - 对于任何源项,完成上一个Observable并立即创建下一个
  • exhaustMap - 上一个Observable未完成时会忽略源项目

答案 1 :(得分:2)

您可以使用merge来"合并"这两个流可以将任何两个观测者的任何发射物发送给观察者:

let source = this.myService.getFoo()
  .merge(this.myService.getMoo(result))
  .subscribe(...);

...或者如果您只想在第一个Observable发出一个值之后订阅第二个Observable,您可以使用mergeMapTo

let source = this.myService.getFoo()
  .mergeMapTo(this.myService.getMoo(result))
  .subscribe(...);

你可以用concatMap做类似的事情,等到内部的Observable竞争。

然而,这实际上取决于你想要达到的目标以及你希望在观察者中得到什么。