在嵌套循环中处理AJAX(Angularjs)

时间:2015-03-18 08:12:35

标签: javascript ajax angularjs promise

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以及稍后进入循环?

2 个答案:

答案 0 :(得分:0)

对于每个ajax调用,您需要在IIFE上绑定ia的值,因为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);
     } 
 }

答案 1 :(得分:0)

由于它是异步调用,因此无法处理何时收到回调AngularJs: $http Synchronous call

我能想到如何处理它的唯一方法是创建一个对象数组并将响应映射到正确的键。收到所有响应后,它可以打印出阵列。像这样:

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);
   });

 } 

}