我需要调用一个api,当数据到达时,我有两件事要做:
我正在使用进行调用和订阅的mergeMap,并且mergeMap只是返回以可观察的方式传入的数据。我是Rx的新手,是否有更好的方法可以做到这一点?
有没有办法避免整体上手动管理订阅?对于最终数据,我只能在ui上使用异步管道。
的链接答案 0 :(得分:0)
您不必在mergeMap
运算符内进行订阅。
mergeMap/flatMap的思想是拉平可观察链。 例如,如果您这样做:
const source = Rx.of('Hello');
source.map(val => doOperationThatReturnsObservable(val)).map(f)
函数f
将收到一个Observable
。
如果您这样做:
const source = Rx.of('Hello');
source.mergeMap(val => doOperationThatReturnsObservable(val)).map(f)
函数f
将接收第二个Observable的值。
换句话说,mergeMap,concatMap,swichtMap是使您可以在保持数据流的同时将可观察对象或映射值映射到可观察对象的函数。
具体针对您描述的问题,我认为您可以通过以下方式解决:
const firstApiCall = createFirstApiCallObservable();
const secondApiCall = firstApiCall.mergeMap(data => createSecondApiCallObservableFromData(data));
// If you need to do the updates in the same time:
Observable.zip(firstApiCall, secondApiCall,
(data1, data2) => [data1, data2])
.subscribe(data => {
data1 = data[0];
data2 = data[1];
doFirstUpdate(data1);
doSecondUpdate(data2);
});
// If you can do the updates separatly:
firstApiCall.subscribe(data1 => doFirstUpdate(data1));
secondApiCall.subscribe(data2 => doSecondUpdate(data2));