如何从rxjs访问以前的mergeMap值

时间:2018-10-24 16:50:46

标签: rxjs

我正在学习使用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是一个异步请求,它返回一个可观察到的信息,以便从远程服务器读取CSV。

readStringToArray是另一个异步请求,该请求返回一个可观察到的结果,以将string转换为Arrays

transposeArray只是进行移调

uploadToDB是一个异步数据库请求,它需要第一个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}`))
  );

1 个答案:

答案 0 :(得分:0)

您为什么不简单地这样做呢?

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

您还可以将内部可观察的函数包装为一个函数:

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