如何在for循环内等待响应?

时间:2019-02-25 08:14:20

标签: javascript typescript ionic-framework ionic3

说明:我在for循环中调用了HTTP请求。我想从服务文件中获取响应,然后增加循环。如何等待从服务文件中获取响应,然后执行循环。 >

for(let i=0;i<final_arr.length;i++)
{
  this.user.list_upload(JSON.stringify(ins_arr)).subscribe(data=>{
      if(data.hasOwnProperty('STATUS'))
      {        if(data.STATUS.toLowerCase()=='success')
        {  
          this.update();
        }
        else if(data.STATUS.toLowerCase() == 'error')
        {
         this.user.showToast(data.MESSAGE);  
        }
      }
    },err=>{
      this.user.showToast("Error occurred in service file");
    });
}
  

请告知

2 个答案:

答案 0 :(得分:3)

您应该使用异步功能。首先将HTTP请求转换为一个Promise,然后在for循环内异步调用该Promise:

 asyncReq (){
    return  new Promise((resolve, reject) => {
          this.user.list_upload(JSON.stringify(ins_arr)).subscribe(data=>{
            if(data.hasOwnProperty('STATUS')){        
              if(data.STATUS.toLowerCase()=='success')
              {  
                this.update();
                resolve();
              }
              else if(data.STATUS.toLowerCase() == 'error')
              {
                this.user.showToast(data.MESSAGE);  
                reject();
              }
            }
          },err=>{
            this.user.showToast("Error occurred in service file");
            reject(err);
          });
      })
  }


  //Async function where loop progresses only after asyncReq completes
  async asyncForFunction () {
    for(let i=0; i < final_arr.length; i++){
      await this.asyncReq ();
    }
  }

答案 1 :(得分:-1)

使用Recursive循环而不是for循环。用首选名称定义一个方法。我将其命名为recursiveHttpCall()。在其他地方开始调用它,然后递归调用recursiveHttpCall(),直到递归count等于数组length

recursiveHttpCall(array, count): void {

    if (array.length >= count) {

      this.user.list_upload(JSON.stringify(ins_arr))
        .subscribe((data: any) => {

            if(data.hasOwnProperty('STATUS')) {        
                if(data.STATUS.toLowerCase()=='success') {  
                    this.update();
                }
                else if(data.STATUS.toLowerCase() == 'error') {
                    this.user.showToast(data.MESSAGE);  
                }
                count = count + 1;
                this.recursiveHttpCall(array, count);
            }

      });

    }
}

然后从所需位置致电recursiveHttpCall()。您可以在ngOnInit()constructor()或以下其他位置调用它。

this.recursiveHttpCall(final_arr, 1);

如果没有,则可以使用button中的click HTML如下调用。

<button ion-button (click)="recursiveHttpCall(final_arr, 1);">Start Loop</button>

希望这对您有所帮助,并找到StackBlitz Demo Here