首页 > 解决方案 > 将两个 observables 合并为一个新的 observables

问题描述

我必须合并 2 种不同类型的 http 请求的结果:

有了这个,我收到了每个项目的项目计数器。DTO 的

ProjectDTO {
  name: string;
  id: number;
}

ItemsProject {
 idProject: number;
 itemsCount: number;
}

在视图中,我只需要显示两件事:project name and items per project.

我要做的是:

    this.vlService.getProjects().pipe(
        mergeMap(projects => {
          this.projects = projects;
          return forkJoin(
            projects.map(project => {
              const projectCount: ItemsProject = {
                idProject: project.idProjects,
                count: 0,
              };
              return this.vlService.getTotalItemsPerProject(projectCount);
            })
          );
        })
      )
      .subscribe(result => {
        console.log('VCOMP | result --> ', result)
      });

它有效,但结果我有一个ItemsProjects. 然后,我应该替换ItemProject.idProjectby Project.name

结果,我想要一个这样的项目数组:

ProjectCounter {
 name: string;
 items: number;
}

有没有更好的方法来实现这一目标?提前致谢

标签: angulartypescriptrxjs

解决方案


您可以尝试在流中传递项目本身,这样您仍然可以在最后访问名称并且不会破坏您的界面结构。

我还没有测试过,但是这样的东西应该可以工作:

this.vlService.getProjects().pipe(
  mergeMap(projects => from(projects).pipe(
    concatMap(project => forkJoin({
      project: of(project),
      items: this.vlService.getTotalItemsPerProject(projectCount).pipe(first())
    })),
    toArray()
  ))
).subscribe(result => {
  console.log('VCOMP | result --> ', result)
});

这应该会产生一个对象数组,其中包含project: ProjectDTOitems: ItemsProject[]


推荐阅读