如何switchmap - 发射同时包含原始和新的可观察的对象?

如何switchmap - 发射同时包含原始和新的可观察的对象?

问题描述:

我想创建一个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

我编辑了这个问题,我希望现在更清楚 –

我觉得你可以做:

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" 
}