【问题标题】:how to access previous mergeMap values from rxjs如何从 rxjs 访问以前的 mergeMap 值
【发布时间】:2018-10-24 16:50:46
【问题描述】:

我正在学习使用 RXJS。在这种情况下,我使用 rxjs 链接了一些异步请求。在最后一个mergeMap 中,我想访问第一个mergeMap 的参数。我已经使用GlobalwithLatest 探索了该选项,但是这两个选项似乎都不适合这里。

const arraySrc$ = from(gauges).pipe(
    mergeMap(gauge => {
      return readCSVFile(gauge.id);
    }),
    mergeMap((csvStr: any) => readStringToArray(csvStr.data)),
    map((array: string[][]) => transposeArray(array)),
    mergeMap((array: number[][]) => forkJoin(uploadToDB(array, gauge.id))),
    catchError(error => of(`Bad Promise: ${error}`))
  );

readCSVFile 是一个异步请求,它返回一个 observable 以从远程服务器读取 CSV。

readStringToArray 是另一个异步请求,它返回一个可将string 转换为Arrays 的可观察对象

transposeArray 只是进行转置

uploadToDB是异步DB请求,需要第一个mergeMap中的gague.id

我如何得到它?就为什么我这样做的方式不好接受一些建议会很棒。

目前,我只是逐层传递ID,但感觉不正确。

const arraySrc$ = from(gauges).pipe(
    mergeMap(gauge => readCSVFile(gauge.id)),
    mergeMap(({ data, gaugeId }: any) => readStringToArray(data, gaugeId)),
    map(({ data, gaugeId }) => transposeArray(data, gaugeId)),
    mergeMap(({ data, gaugeId }) => uploadToDB(data, gaugeId)),
    catchError(error => of(`Bad Promise: ${error}`))
  );

【问题讨论】:

标签: rxjs


【解决方案1】:

你为什么不简单地这样做?

const arraySrc$ = from(gauges).pipe(
    mergeMap(gauge => readCSVFile(gauge.id).pipe(
         mergeMap((csvStr: any) => readStringToArray(csvStr.data)),
         map((array: string[][]) => transposeArray(array)),
         mergeMap((array: number[][]) => forkJoin(uploadToDB(array, gauge.id)))
    )),
    catchError(error => of(`Bad Promise: ${error}`))
);

你也可以将内部的 observable 包装在一个函数中:

uploadCSVFilesFromGaugeID(gaugeID): Observable<void> {
     return readCSVFile(gaugeID).pipe(
         mergeMap((csvStr: any) => readStringToArray(csvStr.data)),
         map((array: string[][]) => transposeArray(array)),
         mergeMap((array: number[][]) => forkJoin(uploadToDB(array, gaugeID))
     );
}

为了在最后做到这一点:

const arraySrc$ = from(gauges).pipe(
    mergeMap(gauge => uploadCSVFileFromGaugeID(gauge.id)),
    catchError(error => of(`Bad Promise: ${error}`))
);

【讨论】:

    猜你喜欢
    • 2021-07-26
    • 1970-01-01
    • 2022-01-24
    • 2018-07-31
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2018-03-09
    相关资源
    最近更新 更多