Angularjs $http 服务中的 for 循环计数器

Angularjs for-loop counter in $http service

我在 angular 中使用下面的 for 循环。我的问题是 forItr 计数器反映为在使用 $http 服务后增加了。

代码:

var app = angular.module('noviceApp', []);
app.controller('noviceAppController', ['$scope', '$http', function ($scope, $http) {

var iterations = 1;

    $scope.myFunction = function() {  
        for(var forItr = 0; forItr < iterations; forItr++) { 
            var params = {};   
            params.testStr = forItr; 
            console.log("foritr before post: " + forItr);  
            $http.get('http://localhost:9200/_stats/index,store')  
                .success(function(data, status) {
                console.log("foritr after post: " + forItr);   
            }); 
        } 
    }
}]);

日志: post 之前的 foritr:0 post 之后的 foritr:1

forItr没有完成for循环怎么变成“1”?无论如何,有没有参考计数器的for循环值?

非常感谢

那是因为它在 $http 完成之前就被更新了,你可以将它包裹在一个闭包中来解决这个问题:

var app = angular.module('noviceApp', []);
app.controller('noviceAppController', ['$scope', '$http', function ($scope, $http) {

var iterations = 1;

    $scope.myFunction = function() {  
        for(var forItr = 0; forItr < iterations; forItr++) { 
            (function(forItr){
                var params = {};   
                params.testStr = forItr; 
                console.log("foritr before post: " + forItr);  
                $http.get('http://localhost:9200/_stats/index,store')  
                    .success(function(data, status) {
                    console.log("foritr after post: " + forItr);   
                });                 
            })(forItr);
        } 
    }
}]);

您需要使用一些闭包函数,该函数在函数结束前会保留其值。您可以通过 Angular 方式将 foreach 替换为 angular.forEach 来创建自己的函数,并且在该函数中值和索引将始终可用

代码

angular.forEach(iterations, function(value, index){
       var params = {};   
       params.testStr = index; 
       console.log("Index before post: " + index);  
       $http.get('http://localhost:9200/_stats/index,store')  
       .success(function(data, status) {
          console.log("Index after post: " + index);   
       }); 
});