angular - 将两个 observables 合并为一个新的 observables
问题描述
我必须合并 2 种不同类型的 http 请求的结果:
- 请求 1:获取项目。返回一个
Observable<ProjectDTO[]>
- 请求 2:根据项目的数量,我必须进行 N 次调用(第一次调用列表中的每个项目一个)。返回一个对象
ItemsProject
有了这个,我收到了每个项目的项目计数器。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.idProject
by Project.name
。
结果,我想要一个这样的项目数组:
ProjectCounter {
name: string;
items: number;
}
有没有更好的方法来实现这一目标?提前致谢
解决方案
您可以尝试在流中传递项目本身,这样您仍然可以在最后访问名称并且不会破坏您的界面结构。
我还没有测试过,但是这样的东西应该可以工作:
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: ProjectDTO
和items: ItemsProject[]
推荐阅读
- c - 位比较代码,希望帮助理解它
- java - 拖放侦听器和处理程序不起作用 [JavaFX]
- google-apps-script - 谷歌表单复选框结果为谷歌工作表中的新行
- html - 卡住创建嵌套的下拉导航菜单
- react-native - 如何在反应原生元素中使用列表导航
- graphql - 通过查询或突变检查电子邮件/用户名的可用性?
- angular - 基于项目模板的 Angular 应用程序
- java - 带有 EX、EEX、EXP 或 EE 科学记数法的字符串加倍
- firebase - 通过 HTTP 触发时 Firebase Cloud Function 执行两次
- ef-core-2.1 - 在尝试将 lambda 表达式传递到 Where 子句后,得到“尝试延迟加载分离实体上的导航属性”