Angular 角度使HttpClient获得';等一下
因此,在这里,我将通过调用Angular 角度使HttpClient获得';等一下,angular,typescript,http,httpclient,Angular,Typescript,Http,Httpclient,因此,在这里,我将通过调用this.Reload.All()来初始化我的数组,以获取我需要的所有数组,以便在程序中稍后进行筛选。发生的情况是,所有4个呼叫都发出,然后4个响应返回。这会使服务混乱和中断,因为它无法在回复之前接收这么多呼叫。我正在寻找的是一个同步解决方案,它可以做这样的事情:调用1-响应1-调用2-响应2-调用3-响应3-调用4-响应4。reponse.dbX_response.view就是我的JSON从服务器返回的方式 我所有的代码都正常工作,只是异步中断了我的调用。我怎样才能解
this.Reload.All()
来初始化我的数组,以获取我需要的所有数组,以便在程序中稍后进行筛选。发生的情况是,所有4个呼叫都发出,然后4个响应返回。这会使服务混乱和中断,因为它无法在回复之前接收这么多呼叫。我正在寻找的是一个同步解决方案,它可以做这样的事情:调用1-响应1-调用2-响应2-调用3-响应3-调用4-响应4。reponse.dbX_response.view就是我的JSON从服务器返回的方式
我所有的代码都正常工作,只是异步中断了我的调用。我怎样才能解决这个问题
//Reload Reference Arrays
RefVehicleTypes = [];
RefClients = [];
RefUsers = [];
RefObjects = [];
//Reload Class:
Reload = {
DoCall : (pUrl, pArray, pResponse) => {
this.HttpClient.get(pUrl).subscribe(
(response: any) => {
this[pArray] = eval(pResponse);
console.log(pResponse + ' : ' + this[pArray]);
}
);
},
All : () => {
this.Reload.VehicleTypes();
this.Reload.Clients();
this.Reload.Users();
this.Reload.Objects();
},
VehicleTypes : () => {
this.Reload.DoCall(
'http://...',
'RefVehicleTypes',
'response.dbVehicleType_response.view',
);
},
Clients : () => {
this.Reload.DoCall(
'http://...',
'RefClients',
'response.dbClient_response.view',
);
},
Users : () => {
this.Reload.DoCall(
'http://...',
'RefUsers',
'response.dbUser_response.view'
);
},
Objects : () => {
this.Reload.DoCall(
'http://...',
'RefObjects',
'response.dbObject_response.view'
);
}
}
新编辑:
因此,我用这个方法替换了DoCall和All方法,但仍然不起作用。查看下面的屏幕截图以了解结果
DoCall : (pUrl, pArray, pResponse) => {
return new Promise((resolve, reject) => {
this.HttpClient.get(pUrl).subscribe(
(response: any) => {
console.log('##############################' + pArray)
console.log(this[pArray]);
this[pArray] = eval(pResponse);
console.log(this[pArray]);
resolve();
}
)
});
},
All : async () => {
await this.Reload.VehicleTypes();
await this.Reload.Clients();
await this.Reload.Users();
await this.Reload.Objects();
},
以下是3次刷新的3个屏幕截图。如您所见,asyncAll()函数似乎会导致数组混合,这是正常的。不知道为什么,但它仍在某种程度上推迟了回应。最后一个总是有效的,这可能意味着之前的回答会被下一个回答所取代
因此,这只是在这里编写的,因此代码没有经过测试,但是类似的东西应该可以使调用同步
Reload = {
DoCall : (pUrl, pArray, pResponse) => {
return new Promise((resolve, reject) => {
this.HttpClient.get(pUrl).subscribe(
(response: any) => {
this[pArray] = eval(pResponse);
console.log(pResponse + ' : ' + this[pArray]);
resolve();
}
);
}
},
All : () => {
this.Reload.VehicleTypes().then(() => {
return this.Reload.Clients();
}).then(() => {
return this.Reload.Users();
}).then(() => {
return this.Reload.Objects();
}).then(() => {
console.log("Everything reloaded");
});
},
VehicleTypes : () => {
return this.Reload.DoCall(
'http://...',
'RefVehicleTypes',
'response.dbVehicleType_response.view',
);
},
Clients : () => {
return this.Reload.DoCall(
'http://...',
'RefClients',
'response.dbClient_response.view',
);
},
Users : () => {
return this.Reload.DoCall(
'http://...',
'RefUsers',
'response.dbUser_response.view'
);
},
Objects : () => {
return this.Reload.DoCall(
'http://...',
'RefObjects',
'response.dbObject_response.view'
);
}
}
或者,在更新的JS版本中,您可以使用
All : async () => {
await this.Reload.VehicleTypes();
await this.Reload.Clients();
await this.Reload.Users();
await this.Reload.Objects();
},
在仍然使用承诺的情况下。因此,这只是在这里编写的,因此代码没有经过测试,但是类似的东西应该可以使您的调用同步
Reload = {
DoCall : (pUrl, pArray, pResponse) => {
return new Promise((resolve, reject) => {
this.HttpClient.get(pUrl).subscribe(
(response: any) => {
this[pArray] = eval(pResponse);
console.log(pResponse + ' : ' + this[pArray]);
resolve();
}
);
}
},
All : () => {
this.Reload.VehicleTypes().then(() => {
return this.Reload.Clients();
}).then(() => {
return this.Reload.Users();
}).then(() => {
return this.Reload.Objects();
}).then(() => {
console.log("Everything reloaded");
});
},
VehicleTypes : () => {
return this.Reload.DoCall(
'http://...',
'RefVehicleTypes',
'response.dbVehicleType_response.view',
);
},
Clients : () => {
return this.Reload.DoCall(
'http://...',
'RefClients',
'response.dbClient_response.view',
);
},
Users : () => {
return this.Reload.DoCall(
'http://...',
'RefUsers',
'response.dbUser_response.view'
);
},
Objects : () => {
return this.Reload.DoCall(
'http://...',
'RefObjects',
'response.dbObject_response.view'
);
}
}
或者,在更新的JS版本中,您可以使用
All : async () => {
await this.Reload.VehicleTypes();
await this.Reload.Clients();
await this.Reload.Users();
await this.Reload.Objects();
},
在仍然使用承诺时。在
DoCall
方法中返回承诺,并在All
方法中链接命令,或者使用wait
Fussel您介意写一个基本的例子吗?我对angular非常陌生,承诺非常棘手在DoCall
方法中返回一个承诺,并在All
方法中链接命令,或者使用wait
Fussel你介意写一个基本的例子吗?我对angular非常陌生,承诺也非常棘手,所以我尝试了您的解决方案(我在All()函数中添加了async,否则等待会给出错误,这是错误的吗?)。但这仍然不起作用。请看一看我编辑的问题:)你也用其他方法回报承诺吗?同样,我很新,所以不确定,不这样认为。这是我现在唯一使用承诺的地方。我有我原来问题中的代码,除了修改过的DoCall和All方法,现在看起来像编辑帖子。在我的代码中还有一个return
,在所有其他方法中也有一个return
,因此这些方法将承诺返回给使用wait的All
方法。老兄,谢谢你,这是有效的!这是我长期以来一直在努力解决的问题。你能解释一下“或者在更新的JS版本中你可以使用”部分吗?如果我在这里使用await,那么await单词会给出一个错误吗?也许编辑你的帖子?所以我尝试了你的解决方案(我想我在All()函数中添加了async,否则等待会给出错误,这是错误的吗?)。但这仍然不起作用。请看一看我编辑的问题:)你也用其他方法回报承诺吗?同样,我很新,所以不确定,不这样认为。这是我现在唯一使用承诺的地方。我有我原来问题中的代码,除了修改过的DoCall和All方法,现在看起来像编辑帖子。在我的代码中还有一个return
,在所有其他方法中也有一个return
,因此这些方法将承诺返回给使用wait的All
方法。老兄,谢谢你,这是有效的!这是我长期以来一直在努力解决的问题。你能解释一下“或者在更新的JS版本中你可以使用”部分吗?如果我在这里使用await,那么await单词会给出一个错误吗?也许编辑你的帖子?