带有异步http请求的Typescript foreach()

时间:2018-11-24 15:32:29

标签: angular typescript asynchronous foreach


我的角度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 

}

很高兴,

2 个答案:

答案 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 **/
});

请注意,我是在手机上写的