2017-06-16 69 views
0

我有一個相當笨重的面色一組代碼,其中從一個可觀察的數據被反饋到另一個,就像這樣:Rxjs一個可觀察給其它

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

我知道,有很多方法可以結合和鏈,但我需要將來自源的數據輸入source2。訂閱的嵌套看起來很糟糕,我很肯定有更好的方法來做到這一點。

謝謝!

回答

2

爲了將Observable發射的物體轉換爲另一個Observable,您可能需要使用flatMap運算符。它創建一個內部Observable並將其結果平鋪到外部流中。

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

這裏有一些屋經營者可以使用不同的表現:

  • flatMap/mergeMap - 創建立即對任何源項目可觀察到的,所有以前的觀測值都保持活力
  • concatMap - 等待先前的內部Observable在創建下一個之前完成
  • sw itchMap - 對任何來源的項目,完成了以往內觀察到的,將立即創建下一個
  • exhaustMap - 而此前內可觀察到未完成
+0

感謝您的信息源項目將被忽略。這就是訣竅! –

1

您可以使用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類似的事情,這將等到內可觀測compeletes。

但是,它確實取決於您想要實現的目標以及您希望在觀察者中獲得的目標。