订阅内部的内部可观察合并地图,这是不好的做法吗?

时间:2019-03-14 09:13:00

标签: javascript rxjs

我需要调用一个api,当数据到达时,我有两件事要做:

  1. 更新一组数据
  2. 以可观察的结果再次调用api,以更新第二组数据。

我正在使用进行调用和订阅的mergeMap,并且mergeMap只是返回以可观察的方式传入的数据。我是Rx的新手,是否有更好的方法可以做到这一点?

有没有办法避免整体上手动管理订阅?对于最终数据,我只能在ui上使用异步管道。

这是stackblitz

的链接

1 个答案:

答案 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));