angular - 多个http调用角度7
问题描述
我遇到了一种情况,我必须根据父数据获取一些数据
我发出了一个 http get 请求来获取所有组件列表,并且在订阅中我有一个 forEach 循环来遍历每个组件。
在每个组件的 for 循环中,我进行了另一个 http get 调用以获取每个组件的子组件。
- 在外部循环中,我必须仅将组件名称推送到新数组,而在内部循环中,我必须将子组件名称推送到与属性“children”相同的数组中。
现在的问题是外部循环在内部循环之前完成,因此数组如下所示
[{名称:'parentcomp1',孩子:[{}]}]
这是代码
prepareJson() {
this.service.getComps().subscribe(res =>{
var comps = res;
var that = this;
for(var element of comps) {
that.service.getChilds(element._id).subscribe((res1:any)
=>{
if(res1.length>0)
list.push({name:element.name,children:res})
},err => console.log(err));
}
},err => console.log(err));
}
请帮忙。
解决方案
要首先修复上述代码,您的函数应该返回一个 Observable/Promise,因为 HTTP 调用是异步的。
此外,您可以使用“mergeMap”来解决您面临的进一步问题。一个例子是这样的(注意:代码未经测试)
import { Observable, from, EMPTY, Subject } from 'rxjs';
import { mergeMap, finalize, catchError } from 'rxjs/operators';
private prepareJson(): Observable<T> {
const response$ = new Subject<T>();
this.service.getComps().subscribe(res => {
const comps = res;
from(comps)
.pipe(
mergeMap((element: any) => {
return this.service.getChilds(element._id)
.pipe(
catchError(err => {
console.log(err);
return EMPTY;
})
);
}),
finalize(() => {
response$.next(list);
response$.complete();
}),
).subscribe((res1: any) => {
if (res1.length > 0) {
list.push({ name: element.name, children: res });
}
});
}, (err) => {
console.log(err);
response$.error(err);
response$.complete();
});
return response$.asObservable();
}
在这里,'prepareJson' 是返回一个可观察到的外部世界。我们正在从“getComps”中获取结果,并在此基础上获取子项。一旦检索到所有结果,就会通过 observable 触发结果。
推荐阅读
- javascript - 在 Typescript 原始函数中访问“this”
- python - 当用户导入已弃用的变量时引发自定义 ImportError
- android - 无法从嵌套静态类访问复选框对象
- sql - 在 Oracle 中删除对象后权限丢失
- sql-server - LOG_BACKUP 文件已满时无法备份数据库
- python - 没有名为错误的模块,但 pip freeze 显示模块已安装在 virtualenv 中
- java - Java 8 按键组映射
- linux - 为另一台服务器编译 gawk 可执行文件
- java - Visual GC 无法看到本地主要方法的直方图
- java - android - 如何从文件中检索 MPAndroidChart ArrayList