在嵌套循环中处理 AJAX (Angularjs)
Handling AJAX in nested loop (Angularjs)
var $scope.units = [1,2];
var $scope.shiftplans = ['plan1','plan2','plan3']
for(var i=0;i<$scope.units.length;i++){
for(var a=0;a<$scope.shiftplans.length;a++) {
console.log('i:'+i);
console.log('a:'+a);
}
}
打印:
i:0
a:0
i:0
a:1
i:0
a:2
i:1
a:0
i:1
a:1
i:1
a:2
但是:
var $scope.units = [1,2];
var $scope.shiftplans = ['plan1','plan2','plan3']
for(var i=0;i<$scope.units.length;i++){
for(var a=0;a<$scope.shiftplans.length;a++) {
***$http.get(function(){
console.log('i:'+i);
console.log('a:'+a);
});***
}
}
上面的控制台登录 ajax 根据 ajax 响应以不同的值打印值。
如何处理 AJAX 完成并稍后移动到循环?
您需要为每个 ajax 调用在 IIFE 上绑定 i
和 a
的值,因为 ajax 调用是异步的,不像for 循环
示例:
for(var i=0;i<$scope.units.length;i++){
for(var a=0;a<$scope.shiftplans.length;a++) {
(function(_i, _a) {
***$http.get(function(){
console.log('i:'+_i);
console.log('a:'+_a);
});***
})(i, a);
}
}
由于是异步调用,无法处理何时收到回调
我能想到的唯一处理方法是创建一个对象数组并将响应映射到正确的键。在收到所有响应后,它可以打印出数组。像这样:
var $scope.units = [1,2];
var $scope.shiftplans = ['plan1','plan2','plan3'];
var sizeOfResponses = $scope.units.length * $scope.shiftplans.length;
var countOfResponses = 0;
var responsesArray = [];
for(var i=0;i<$scope.units.length;i++){
for(var a=0;a<$scope.shiftplans.length;a++) {
var index = i * $scope.units.length + a;
responsesArray[index] = {i: null, a: null
$http.get(function(){
responsesArray[index].i = +i;
responsesArray[index].a = +a;
countOfResponses++;
if(countOfResponses === sizeOfResponses)console.log(responsesArray);
});
}
}
var $scope.units = [1,2];
var $scope.shiftplans = ['plan1','plan2','plan3']
for(var i=0;i<$scope.units.length;i++){
for(var a=0;a<$scope.shiftplans.length;a++) {
console.log('i:'+i);
console.log('a:'+a);
}
}
打印:
i:0 a:0 i:0 a:1 i:0 a:2 i:1 a:0 i:1 a:1 i:1 a:2
但是:
var $scope.units = [1,2];
var $scope.shiftplans = ['plan1','plan2','plan3']
for(var i=0;i<$scope.units.length;i++){
for(var a=0;a<$scope.shiftplans.length;a++) {
***$http.get(function(){
console.log('i:'+i);
console.log('a:'+a);
});***
}
}
上面的控制台登录 ajax 根据 ajax 响应以不同的值打印值。
如何处理 AJAX 完成并稍后移动到循环?
您需要为每个 ajax 调用在 IIFE 上绑定 i
和 a
的值,因为 ajax 调用是异步的,不像for 循环
示例:
for(var i=0;i<$scope.units.length;i++){
for(var a=0;a<$scope.shiftplans.length;a++) {
(function(_i, _a) {
***$http.get(function(){
console.log('i:'+_i);
console.log('a:'+_a);
});***
})(i, a);
}
}
由于是异步调用,无法处理何时收到回调
我能想到的唯一处理方法是创建一个对象数组并将响应映射到正确的键。在收到所有响应后,它可以打印出数组。像这样:
var $scope.units = [1,2];
var $scope.shiftplans = ['plan1','plan2','plan3'];
var sizeOfResponses = $scope.units.length * $scope.shiftplans.length;
var countOfResponses = 0;
var responsesArray = [];
for(var i=0;i<$scope.units.length;i++){
for(var a=0;a<$scope.shiftplans.length;a++) {
var index = i * $scope.units.length + a;
responsesArray[index] = {i: null, a: null
$http.get(function(){
responsesArray[index].i = +i;
responsesArray[index].a = +a;
countOfResponses++;
if(countOfResponses === sizeOfResponses)console.log(responsesArray);
});
}
}