javascript - 在循环中使用 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){
不等待从服务器获取响应。
解决方案
您正在混合 async/await 和 rx。你实际上可以这样做(但你可能不应该这样做),因为 Observables 有一个toPromise()
方法,你可以等待生成的 Promise。但subscribe()
不返回 Promise,它返回一个订阅。订阅用于取消订阅,不是 Promise,因此不可等待。
推荐阅读
- apache-nifi - handleHttpRequest 上的 Nifi SSL 配置
- extjs - initComponent 处的 extjs selectionmodel 复选框
- ionic-framework - 使用离子警报评级警报/功能
- product - Big Commerce - 在产品列表页面上获取产品选项/属性
- ms-office - 如何在 Microsoft Server 2012 R2 上安装 Access 数据库引擎
- ios - 更新应用程序版本时缺少推送通知权利
- eclipse - Eclipse / Spring Boot / Camunda 的问题
- google-apps-script - 使用谷歌应用脚本在谷歌表单中禁用“回复回执”?
- python - 删除虚拟环境后安装的软件包会怎样?
- javascript - 生成具有数字子集范围的数组的数组函数