我有一个关于requests的问题。我发出第一个请求然后我想首先onSuccess方法将运行但程序立即发出第二个请求。我该如何处理它? Context.getAlarmGroupById
立即被召唤2次。
我的代码:
function loadAll () {
Context.getAlarmGroupChainById({
id: $stateParams.id
}, onSuccess, onError);
function onSuccess(data, headers) {
vm.temp=data;
var numberGroupChain=vm.temp.length;
for(var i=0; i<numberGroupChain; i++){
vm.location.push(vm.temp[i].location);
vm.alarmChainList.push({name: vm.location[i],active:null,totalAlarmGroupNumber:null});
//loadData(vm.temp[i].id);
asyncLoop(vm.temp[i].id);
}
}
function onError(error) {
AlertService.error(error.data.message);
}
var index = 0;
function asyncLoop(chainId) {
if(index >= vm.temp.length) {
return;
}
Context.getAlarmGroupById({
id:chainId
}, onSuccess, onError);
function onSuccess(data,headers){
index++;
asyncLoop();
}
function onError(data,headers){
index++;
asyncLoop();
}
}
}
答案 0 :(得分:1)
首先: Car.getGroupId
是一个异步函数。因此,您必须确保在下一次通话之前完成上一次通话。
其次:创建递归函数以替换循环,在success
函数和索引增量之后,调用递归函数以确保满足您的要求。
第三:在循环后更改asyncLoop(vm.temp[i].id);
的调用顺序:
<强>最后:强>
请使用以下代码:
function loadAll () {
var index = 0;
function asyncLoop(chainId) {
if(index >= vm.temp.length) {
return;
}
Context.getAlarmGroupById({
id:vm.temp[index].id
}, onSuccess, onError);
function onSuccess(data,headers){
index++;
asyncLoop();
}
function onError(data,headers){
index++;
asyncLoop();
}
}
function onSuccessParent(data, headers) {
vm.temp=data;
var numberGroupChain=vm.temp.length;
for(var i=0; i<numberGroupChain; i++){
vm.location.push(vm.temp[i].location);
vm.alarmChainList.push({name: vm.location[i],active:null,totalAlarmGroupNumber:null});
//loadData(vm.temp[i].id);
}
asyncLoop();
}
function onErrorParent(error) {
AlertService.error(error.data.message);
}
Context.getAlarmGroupChainById({
id: $stateParams.id
}, onSuccessParent, onErrorParent);
}
答案 1 :(得分:0)
这是纯粹的JavaScript方法,它可以完美地运行。使用Promise.then()。如下所示:
var request1 = new Promise(function(resolve, reject) {
resolve('Success!');
});
request1.then(function(value) {
// make request2 here
});