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

Handling AJAX in nested loop (Angularjs)

本文关键字:Angularjs AJAX 处理 嵌套循环      更新时间:2023-09-26
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 上绑定 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);
     } 
 }

由于是异步调用,因此无法处理何时接收回调 AngularJs: $http 同步调用

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

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

}