首页 > 解决方案 > 在循环中使用 Async Await

问题描述

我遇到了一个问题,我必须将一些存储在数组中的 JSON 数据发送到服务器。问题是循环只是运行到下一次迭代而不等待从服务器获得响应。我不想使用超时原因我无法预先判断服务器的响应时间。

 async  uploadResponces(responseList) {
var idList = responseList;

for (let i = 0, j = 1; i < idList.length; i++ , j++) {
  var newArray = JSON.parse(idList[i].response)

  await this.apiConnect.postResponseTwo('submitform', newArray).then((data) => {
    self.submitStatus = data;
    alert(JSON.parse(this.submitStatus))
    if (this.submitStatus.status == "success") {
      alert(idList[i].id)
      var topush = JSON.stringify(idList[i].id)
      this.submited.push(idList[i].id)
      if (j == idList.length) {
        alert("submited array" + this.submited)
        this.deleteresponse()
      }
    }
  }).catch((errr)=>alert(JSON.stringify(errr)))
 }
}

apiconnect.postResponseTwo 是-

postResponseTwo(endpoint: string, body: any, reqOpts?: any) {
return new Promise((resolve, reject) => {
  console.log("post responce function");
  let httpHeaders = new HttpHeaders({
    'Access-Control-Allow-Origin': '*',
    'Content-Type': 'application/json',
    'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, DELETE, PUT',
    'Access-Control-Allow-Headers': 'Accept,Accept-Language,Authorization,Content-Language,Content-Type',
    'Access-Control-Expose-Headers': 'Content-Length,Content-Range',

  });

  reqOpts = {
    headers: httpHeaders
  };
  let getURL = this.formUrl + endpoint;
  alert(endpoint + reqOpts);
  alert("url " + getURL);
  alert("passing object " + body);
  this.http.post(getURL, body, reqOpts).map((data) => {
    resolve(data)
    // alert("from server " + JSON.stringify(data));
    //  alert(JSON.stringify(data))

  }, err => {
    alert("error " + JSON.stringify(err));
  })
 });
}

这里的函数 postResponse 正在循环内向服务器发送数据,但 if(j==idList.length){不等待从服务器获取响应。

标签: javascriptangularionic-framework

解决方案


您正在混合 async/await 和 rx。你实际上可以这样做(但你可能不应该这样做),因为 Observables 有一个toPromise()方法,你可以等待生成的 Promise。但subscribe()不返回 Promise,它返回一个订阅。订阅用于取消订阅,不是 Promise,因此不可等待。


推荐阅读