2014-03-19 161 views
0

我有循環功能與承諾:角承諾在循環

for (var a in $scope.atrakcje) { 
    if ($scope.atrakcje[a].x && $scope.atrakcje[a].y) { 
    App.countDistance($scope.atrakcje[a].x, $scope.atrakcje[a].y).then(function(km) { 
     $scope.atrakcje[a].distance = km; 
    }); 
    } 
} 

這個循環的問題是,所有公里值分配給最後一個$ scope.atrakcje元素。 它應該將第一個承諾分配給第一個元素,第二個承諾分配給第二個承諾,依此類推。 如何做到這一點?

+1

這可以解決你的問題http://stackoverflow.com/questions/1451009/javascript-infamous-loop-issue –

+0

的可能重複[ Javascript閉合內循環 - 簡單實用的例子](http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Bergi

回答

3

嘗試:

for (var a in $scope.atrakcje) { 
    if ($scope.atrakcje[a].x && $scope.atrakcje[a].y) { 
    (function(index) { 
     App.countDistance($scope.atrakcje[index].x, $scope.atrakcje[index].y).then(function(km) { 
     $scope.atrakcje[index].distance = km; 
     }); 
    })(a); 
    } 
} 
+0

完美的作品 - 謝謝! – piernik

0

這裏的問題是,for循環結束後,您的then函數被調用,這意味着當承諾解決了,a變量將包含從$範圍最後的關鍵.atrakcje。創建它周圍的閉合捕獲鍵的值,是這樣的:

Object.keys($scope.atrakcje).forEach(function(a) { 
    if ($scope.atrakcje[a].x && $scope.atrakcje[a].y) { 
    App.countDistance($scope.atrakcje[a].x, $scope.atrakcje[a].y).then(function(km) { 
     $scope.atrakcje[a].distance = km; 
    }); 
    } 
});