2015-05-05 20 views
0

我正在使用下面的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); 
      }); 
     } 
    } 
}]); 

日誌:後前 foritr:0 foritr後後:1

如何forItr成爲 「1」,如果還沒有完成的循環?無論如何要引用計數器的for循環值嗎?

非常感謝

+0

'$ http'是一個異步調用,意義做在角的方式通過更換foreach在成功函數有機會觸發之前,您的代碼將繼續運行。 – azium

+0

[AngularJS:循環POST請求並將每個索引傳遞到相關響應中]的可能重複(http://stackoverflow.com/questions/17256513/angularjs-loop-post-requests-and-pass-each-index-into- related -response) –

回答

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

這是一個非常優雅的答案。我印象深刻。 – azium

+0

謝謝(大家)的幫助。我必須查看什麼是關閉(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures),現在我知道了。抱歉耽擱了。 – Gregg

+0

按預期工作。謝謝 :) –

0

您需要使用一些閉合功能,將有它的值直到函數結束。你可以用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); 
     }); 
});