当前位置: 首页 > 知识库问答 >
问题:

如何从rxjs访问以前的mergeMap值

钱均
2023-03-14

我正在学习使用RXJS。在这个场景中,我使用rxjs链接了一些异步请求。在上一次合并地图时,我希望能够访问第一个合并地图的参数。我已经探索了使用Globalwith Latest的选项,但这两个选项似乎都不适合这里。

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是另一个异步请求,它返回一个可观察的字符串,以将字符串转换为数组

transposeSarray只进行转置

uploadToDB是异步DB请求,需要gague。来自第一个合并映射的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个答案

唐繁
2023-03-14

你为什么不干脆这样做呢?

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}`))
);
 类似资料:
  • 有人,请解释一下SwitchMap和FlatMap在Javascript方面的区别(在角度透视图中,rxjs 5) 以我的理解。 SwitchMap仅发出最新的可观察值,并取消先前的可观察值。 flatMap收集所有单独的可观测数据,并在单个数组中返回所有可观测数据,而不关心可观测数据的顺序。异步工作。 concatMap保持秩序并发出所有可观察值,同步工作 是这样吗? mergeMap与上面的工

  • 我有一条可以观察到的溪流。第一个运算符是一个mergeMap,它返回一个可观察的数组。然后,我必须有第二个mergeMap从第一个mergeMap的返回中获取最终值。我觉得这第二个合并映射应该是不必要的,但找不到绕过它的方法。 例子: 这最终是我所拥有的。第二个mergeMap只存在于订阅第一个的输出。没有它,我的输出是可观察的(即(1)的

  • 当我使用Angular HttpClient发出GET请求时,我得到一个可观察的返回,并在RxJS操作符mergeMap中处理它。 现在一次又一次地抛出404,我想抓住它。最后,浏览器控制台中不应出现错误消息,并且应使用流的下一个值处理管道。 这有可能吗?我没有用catchError()管理它。 以下是我的代码的简化版本: 更新:添加了带有catchError()的方法 我尝试过这种方式,但没有检

  • 我们有一个执行http请求的请求服务。所有请求都实现IRequest接口,该接口包含http方法和一个执行函数,该函数依次返回另一个可观察的对象。 RequestService有一个重载,它接受一个源可观察对象,还有一个requestfactory,它根据源可观察对象的值返回一个IRequest实例。 当然,在服务中做了更多的工作(日志记录、默认错误处理,...),但大多数与问题无关。 现在,这一

  • mergeMap 函数签名: mergeMap(project: function: Observable, resultSelector: function: any, concurrent: number): Observable 映射成 observable 并发出值。 flatMap 是 mergeMap 的别名! 如果同一时间应该只有一个内部 subscription 是有效的,请尝试

  • 问题内容: 我已经将我的代码重组为,并建立了一个精彩的长期承诺链,其中包含多个回调。最后,我想返回一些复合值,并且需要访问多个中间promise结果。但是,序列中间的分辨率值不在上次回调的范围内,如何访问它们? 问题答案: 当然,语言设计者也意识到了这个问题。他们做了很多工作,异步函数提案最终使它成为了 ECMAScript 8 你不再需要单个调用或回调函数,因为在异步函数(被调用时返回一个Pro