在foreach循环中进行多个http调用异步

时间:2018-08-23 13:49:19

标签: typescript ecmascript-6 async-await observable es6-promise

让我们说我有一个foreach循环

  Object.keys(this.treeMap).forEach(id=>{
    this.getSelectionById(id);
  })
  this.processAfterHttpCalls();

和getSelectionById方法进行http调用

  getSelectionById(id){
      let requestBody = {
        id: id
      };
      this.subscription = this.dependenciesService.getInstancesByCSIId(requestBody)
        .subscribe(data => {
          this.someProcessing(data);
        }, err => {
          this.appMessageService.showMessage(this.appMessageService.ERROR, err);
        })
    }

但是有什么方法可以使那些调用异步,所以一旦在forEach块中调用了http调用,就可以调用另一种方法了?

3 个答案:

答案 0 :(得分:1)

您可以将箭头函数声明为异步函数。

示例:

Object.keys(this.treeMap).forEach(async id=>{
    await this.getSelectionById(id);
})

答案 1 :(得分:1)

如果您的getSelectionById返回一个可观察的值:

getSelectionById(id){
    let requestBody = {
        id: id
    };
    return this.dependenciesService.getInstancesByCSIId(requestBody)
        .pipe(map(data => this.someProcessing(data));
}

您可以将所有http呼叫压缩到一个可观察的内部:

zip(...Object.keys(this.treeMap).map(id=> this.getSelectionById(id)))
    .subscribe(_ => this.processAfterHttpCalls(), err => this.appMessageService.showMessage(this.appMessageService.ERROR, err));

这样,所有的HTTP调用都是并行进行的,当所有的HTTP调用完成时,将调用processAfterHttpCalls。

答案 2 :(得分:-2)

我认为您可以使用setTimeout,因为它异步运行:

Object.keys(this.treeMap).forEach(id=>{
    var self = this;
    setTimeout(function(){
        self.getSelectionById(id);
    },10);
})