Rxjs一个可观察到的馈入另一个

Rxjs一个可观察到的馈入另一个,rxjs,observable,Rxjs,Observable,我有一套相当笨重的代码,其中来自一个可观察对象的数据被馈送到另一个可观察对象,如: let source = this.myService.getFoo() .subscribe(result => { let source2 = this.myService.getMoo(result) .subscribe(result2 => { // do stuff }); }); 我知道有多种方法可以组合和链接,但我需要将源中的数据输入到sou

我有一套相当笨重的代码,其中来自一个可观察对象的数据被馈送到另一个可观察对象,如:

let source = this.myService.getFoo()
   .subscribe(result => {
      let source2 = this.myService.getMoo(result)
         .subscribe(result2 => { // do stuff });
   });
我知道有多种方法可以组合和链接,但我需要将源中的数据输入到source2。订阅的嵌套看起来很糟糕,我很确定有更好的方法可以做到这一点


谢谢

您可以使用
merge
来“合并”两个流,以便将两个可观察物中任何一个的任何发射发送给观察者:

let source = this.myService.getFoo()
  .merge(this.myService.getMoo(result))
  .subscribe(...);
。。。或者,如果您希望仅在第一个观测值发出值后订阅第二个观测值,则可以使用
mergeMapTo

let source = this.myService.getFoo()
  .mergeMapTo(this.myService.getMoo(result))
  .subscribe(...);
你可以用
concatMap
做一个类似的事情,它将等待内部可观察的完成者


但是,这实际上取决于您试图实现的目标以及您希望在您的观察者中接收到的内容。

要将一个观察者发出的项目转换为另一个观察者,您可能需要使用flatMap操作符。它创建了一个内部可观察的,并将其结果平放到外部流

const source = this.myService
    .getFoo()
    .pipe(
        flatMap(result => this.myService.getMoo(result))
     )
    .subscribe(result2 => {
        // do some stuff
    });
以下是一些您可以使用的行为不同的展开运算符:

  • flatMap/mergeMap-立即为任何源项创建一个可观察项,所有以前的可观察项保持活动状态
  • concatMap-在创建下一个可观察对象之前,等待上一个可观察对象完成
  • 开关映射-对于任何源项,完成上一个可观察项并立即创建下一个可观察项
  • 排气量图-当前一个可观察项未完成时,忽略源项

你从哪里得到了
结果
呢?如果函数比
getFoo
getMoo
更具描述性,那就太好了,因为我是RxJS的初学者,不能真正理解那些函数调用应该返回什么,我假设很多人都有同样的问题。