【问题标题】:Subscribing to inner Observable inside merge map, is it bad practice?在合并图中订阅内部 Observable,这是不好的做法吗?
【发布时间】:2019-03-14 09:12:59
【问题描述】:

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

  1. 更新一组数据
  2. 使用 observable 的结果再次调用 api 以更新第二组数据。

我正在使用一个进行调用和订阅的mergeMap,mergeMap 只是返回作为可观察对象传入的数据。我是 Rx 新手,有没有更好的方法来完成这个?

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

这里是stackblitz的链接

【问题讨论】:

    标签: javascript rxjs


    【解决方案1】:

    您不必在 mergeMap 运算符内订阅。

    mergeMap/flatMap 的想法是扁平化 Observable 链。 例如,如果您这样做:

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

    【讨论】:

    • 所以,这就是为什么我应该在 flatMap 里面做:flatMap(v => return apicall.get())?
    • 是的,如果apicall.get() 返回一个 Observable,这个 observable 的“链”将被扁平化为一个 Observable。
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多