如何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}
任何帮助表示赞赏。
答
我觉得你可以做:
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()
运营商把这种可观察到ConnectableObservable
与ReplaySubject
内,支持缓存。我想你不想拨打getValue1()
两次。
然后forkJoin()
等待两个Observables完成并在数组中发出它们的值。
见现场演示:https://jsbin.com/posanup/3/edit?js,console
这将打印到控制台:
[object Object] {
value1: "value1",
value2: "value2"
}
这实在是令人困惑的。什么是'getValue2UsingValue1()'?什么意思是“*我不想订阅原始观察值以获得value2 *”?你可以在plnkr或jsfiddle上进行演示吗? – martin
我编辑了这个问题,我希望现在更清楚 –