2016-11-07 51 views
1

我想創建一個observable,它首先從異步函數中獲取一個值,然後使用該值異步獲取另一個值,併發出一個包含這兩個值的對象。如何switchmap - 發射同時包含原始和新的可觀察的對象?

喜歡的東西:

function getValue1(){ 
    // asynchronously... 
    return Observable.of(value1); 
} 

function getValue2UsingValue1(value1){ 
    // asynchronously... 
    // value1 is needed to get value2... 
    return Observable.of(value2); 
} 

getValue1() 
    .switchMap(value1=> getValue2UsingValue1(value1)) 
    //... 
    // I want to get an observable that emits an object containing value1 
    // and value2: {value1: value1, value2: value2} 

任何幫助表示讚賞。

+0

這實在是令人困惑的。什麼是'getValue2UsingValue1()'?什麼意思是「*我不想訂閱原始觀察值以獲得value2 *」?你可以在plnkr或jsfiddle上進行演示嗎? – martin

+0

我編輯了這個問題,我希望現在更清楚 –

回答

0

我覺得你可以做:

var value1Cached = getValue1().publishReplay(1); 
value1Cached.connect(); 
var value2 = value1Cached.concatMap(value1 => getValue2UsingValue1(value1)); 

Observable.forkJoin(value1Cached, value2) 
    .map(values => { 
     return {'value1': values[0], 'value2': values[1]}; 
    }) 
    .subscribe(val => console.log(val)); 

我使用publishReplay()運營商把這種可觀察到ConnectableObservableReplaySubject內,支持緩存。我想你不想撥打getValue1()兩次。

然後forkJoin()等待兩個Observables完成並在數組中發出它們的值。

見現場演示:https://jsbin.com/posanup/3/edit?js,console

這將打印到控制檯:

[object Object] { 
    value1: "value1", 
    value2: "value2" 
} 
相關問題