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

jogvjijk  于 2022-11-26  发布在  TypeScript
关注(0)|答案(2)|浏览(151)

我有一个问题,我的Angular webapp。我试图迭代数组,并作出每次HTTP请求,以获得ID的Module,这是一个对象:
{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 something with all the IDs

}

hl0ma9xz

hl0ma9xz1#

您将需要一些RxJS运算符来执行此操作。
使用fromModule[]转换为Observable<Module>,然后将流通过管道传输到mergeMap并执行API请求。使用tap使用API的结果更改模块Object,最后使用toArray收集响应。订阅流以执行所有模块处理完毕后您希望执行的操作。
例如:

from(fit.modules).pipe(
    mergeMap(module => this.http.get(...).pipe(
        tap(apiResponse => module.id = apiResponse.inventory_type)
    )),
    toArray()
).subscribe(allResponses => {
    // do your action
});
yiytaume

yiytaume2#

使用承诺而非订阅者

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

我在手机里写了这个🤓

相关问题