我订阅了一个可观察对象,得到了一个array.对于数组中的每个元素,我希望执行一次异步计算(可以使用From将其作为观察值返回),当所有计算完成后,我希望发布所有答案.我该怎么做呢?

我猜它必须与forkJoin和mergeMap一起工作,但我似乎做不对.

myObservable.pipe(
  tap(data => {
    console.info(data);
    // [{id: 0}, {id: 1}, {id: 2}, ...]
  }),
  mergeMap(data => {
    // ??? Need help here
    const calculatedData = data.map(d => {...d, calculated: myCalculation(d.id).subscribe() });
    // or: const calculatedData = data.map(d => ({...d, calculated: myPromise(d.id)}));
    return forkJoin(calculatedData);
  }),
  tap(finalData => {
    console.info(finalData);
    // [{id: 0, calculated: "0000"}, {id: 1, calculated: "0001"}, {id: 2, calculated: "0002"}]
  }),
  switchMap(finalData => {
    return this.httpClient.post("/url", finalData);
 })
).subscribe();

推荐答案

如果你不想麻烦你--SwitchMap可以是异步的,它可以返回一个promise .

myObservable.pipe(
  tap((data) => {
    console.info(data);
    // [{id: 0}, {id: 1}, {id: 2}, ...]
  }),
  switchMap(async (data) => {
    const calculatedDataPromises = data.map(async (d) => {
      return {
        ...d,
        calculated: await myPromise(d.id)
      };
    });
    return Promise.all(calculatedDataPromises);
  }),
  tap((finalData) => {
    console.info(finalData);
    // [{id: 0, calculated: "0000"}, {id: 1, calculated: "0001"}, {id: 2, calculated: "0002"}]
  }),
  switchMap((finalData) => {
    return this.httpClient.post("/url", finalData);
  })
).subscribe();

没有promise 的例子:

myObservable$
  .pipe(
    tap((data) => {
      console.info(data);
      // [{id: 0}, {id: 1}, {id: 2}, ...]
    }),
    switchMap((data) =>
      combineLatest(
        data.map((d) =>
          myCalculation(d.id).pipe(
            catchError((err) => {
              console.warn(`Error loading calculated for ${d.id}`, err);
              return of(null);
            }),
            map((res) => ({ ...d, calculated: res }))
          )
        )
      )
    ),
    tap((finalData) => {
      console.info(finalData);
      // [{id: 0, calculated: "0000"}, {id: 1, calculated: "0001"}, {id: 2, calculated: "0002"}]
    }),
    switchMap((finalData) => {
      return this.httpClient.post("/url", finalData);
    })
  )
  .subscribe();

Angular相关问答推荐

将Angular Metal的芯片组件集成到我的表单中时出错

文件阅读器未正确给出某些CSV文件的结果

Angular 17自定义指令渲染不起作用'

以Angular 表示显示特殊字符

如何用Effect()识别正确的Angular 信号?

MAT表的内联文本编辑-未刷新编辑图标

在Angular 应用中混合使用较少和较粗俗的文件

角路径S异步旋转变压器仍可观察到

如何处理后端删除元素后元素列表的刷新

Angular Http 拦截器 - 修改标头会导致 CORS

从具有特定 node 值的现有数组创建新数组

使用 BehaviorSubject 从服务更新 Angular 组件

尽管模型中的变量发生了变化,但Angular 视图没有更新

将 html ngModel 值传递给服务Angular

如何 use/import http模块?

如何在 ngFor 循环中创建变量?

Angular 2如何让子组件等待异步数据准备好

Angular2material对话框自动关闭

在 Angular 2 中对 observable 进行单元测试

Angular 4.3 HttpClient:拦截响应