我的角度webapp出现问题。
我正在尝试遍历一个数组,并在每次进行HTTP请求以获取Module
的ID时,都是一个对象:
{name:string, charge:string}
用新的属性id
更新了每个模块后,我想用这些ID做一些事情。为此,我需要所有ID,并且无法单独处理每个Module
。我该如何实现?我知道,因为Angular中的http.get()
函数是异步的,所以我不能简单地将代码粘贴到foreach()
循环之后。
这是我的代码:
ngOnInit() {
let fit = parseFit(megafit.default.fit);
fit.modules.forEach(Module => {
this.http.get(`https://esi.tech.ccp.is/v2/search/?categories=inventory_type&search=${Module.name}&strict=true`)
.subscribe((data:any) => {
Module.id = data.inventory_type
})
});
//Do smth. with all the IDs
}
很高兴,
扬
答案 0 :(得分:1)
您将需要一些RxJS运算符。
使用from使Module[]
到Observable<Module>
,然后将流通过管道传输到mergeMap并执行api请求。使用tap来更改模块对象以及API的结果,最后使用toArray来收集响应。订阅流,以执行所有模块处理后想要执行的操作。
示例:
from(fit.modules).pipe(
mergeMap(module => this.http.get(...).pipe(
tap(apiResponse => module.id = apiResponse.inventory_type)
)),
toArray()
).subscribe(allResponses => {
// do your action
});
答案 1 :(得分:0)
使用承诺而不是订阅者
ngOnInit() {
let fit = parseFit(megafit.default.fit);
const jarOfPromises =[];
fit.modules.forEach(Module => {
jarOfPromises.push(
this.http.get(`https://esi.tech.ccp.is/v2/search/?categories=inventory_type&search=${Module.name}&strict=true`)
.toPromise())
});
Promise.all(jarOfPromises).then(results=>{
/** your code **/
});
请注意,我是在手机上写的