2014-05-19 41 views
4

這裏承諾響應內外部變量是我的代碼

for (var i=0; i<5; i++) { 
    var url = generate_url(i) ; 
    $http.get(url).then(function(response){ 
     var param2 = response.data.param2 
     $scope.outputData.push({'index':i, 'param':param2}) ; 
    }) ; 
} 

在這個例子中,我想獲得在$scope.outputData與此類似數據的數組:

[ 
    {'index':0,param:'a'}, 
    {'index':1,param:'b'}, 
    {'index':2,param:'c'}, 
    {'index':3,param:'d'}, 
    {'index':4,param:'e'}, 
] 

但我得到的是這樣的數據:

[ 
    {'index':4,param:'a'}, 
    {'index':4,param:'b'}, 
    {'index':4,param:'c'}, 
    {'index':4,param:'d'}, 
    {'index':4,param:'e'}, 
] 

在這種情況下,externel數據T帽子我的意思是變量i,

請你能告訴我麻煩嗎?我如何着手參加我的目標?謝謝你提前和對不起我的英文:)

回答

4

您可以創建在i變量封閉,以確保它仍然具有您在使用它時所希望的價值。

for (var i=0; i<5; i++) { 
    (function(counter) { 
     var url = generate_url(i); 
     $http.get(url).then(function(response){ 
      var param2 = response.data.param2 
      $scope.outputData.push({'index':counter, 'param':param2}) ; 
     }); 
    }(i)); 
} 

但如果結果數組事項的順序,你必須創建一個臨時數組,然後index排序。

如果您不想處理任何已完成的請求,則可以使用$q.all

事情是這樣的:

var promises = {}; 
for (var i=0; i<5; i++) { 
    var url = generate_url(i) ; 
    promises[i] = $http.get(url); 
} 
$q.all(promises).then(function(result) { 
    for (index in result) { 
     var param2 = result[index].data.param2 
     $scope.outputData.push({'index':index, 'param':param2}) ; 
    } 
}); 

這也應該保留的順序。

$q的文檔是here

+0

這是正確的答案 –

1

這是一個閉合的問題,做了正確的方式,將

for (var i=0; i<5; i++) { 
    getData(i); 
} 
var getData=function(index) { 
    var url = generate_url(index) ; 
    $http.get(url).then(function(response){ 
     var param2 = response.data.param2 
     $scope.outputData.push({'index':index, 'param':param2}) ; 
    }) ; 
} 
+1

您的解決方案也適用於我,但結果順序不正確,但這不是問題。謝謝。 – user3172446