$ http服务中的Angularjs for-loop计数器

时间:2015-05-05 19:09:31

标签: angularjs http for-loop service

我在角度中使用以下for循环。我的问题是,使用$ http服务后,forItr计数器会反映为增加。

代码:

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

日志: postit之前的帖子:0 帖子之后的帖子:1

如果尚未完成for循环,forItr如何变为“1”?无论如何都要引用计数器的for循环值?

非常感谢

2 个答案:

答案 0 :(得分:2)

那是因为它在$ 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);
        } 
    }
}]);

答案 1 :(得分:0)

您需要使用一些闭包函数,该函数在函数结束之前具有其值。您可以通过将foreach替换为创建自己的函数的angular.forEach并在该函数值和&amp;中以Angular方式执行此操作。索引将始终可用

<强>代码

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