我正在学习使用RXJS。在这种情况下,我使用rxjs链接了一些异步请求。在最后一个mergeMap中,我想访问第一个mergeMap的参数。我已经使用Global
或withLatest
探索了该选项,但似乎这两个选项都不适合。
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}`))
);
答案 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}`))
);