说明:我在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");
});
}
请告知
答案 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。