2013-11-14 33 views
0

我試圖在for循環中分配數組元素,並調用ngResource動作的異步結果。AngularJS:將異步數據分配給for循環中的數組元素

for (var i = 0; i < projs.length; i++) { 
    $scope.projets[i].redacteur = new Object(); // the Object where the result will be stored 
    var param = new Object(); 
    param.email = projs[i].redacteurEmail; 
    Agent.read(param, function(data) { 
     $scope.projets[i].redacteur = data; 
    }); 


} 

的問題是:當執行回調函數(當接收到數據時),i超出限制(它通過了最後i++)。然後收到的數據被分配給一個不存在的對象。

解決這個問題的任何想法?

+2

可能重複(http://stackoverflow.com/questions/1451009/javascript-infamous-loop-problem) –

+2

和[問題與循環](http://stackoverflow.com/questions/6549911/problem-with-loop) –

+2

和[計數器變量的奇怪值在JavaScript](http://stackoverflow.com/questions/10317495/weird-value- for-counter-variable-in-javascript) –

回答

1

我通過將閉包中的回調函數調用解決了此問題。以我的例子,它看起來就像是:?使用Javascript臭名昭著的循環問題]

for (var i = 0; i < projs.length; i++) { 
    $scope.projets[i].redacteur = new Object(); // the Object where the result will be stored 
    var param = new Object(); 
    param.email = projs[i].redacteurEmail; 
    (function(i) { 
     Agent.read(param, function(data) { 
      $scope.projets[i].redacteur = data; 
     }); 
    })(i); 
} 
+0

Trop fort !!你在這裏救了我的皮膚!我現在需要閱讀關於JavaScript關閉。 – Stephane

0

我有類似的問題,我通過使用 承諾解決它。其基本思想是將數組的索引作爲參數發送給我的異步請求回調,然後在響應到達時處理它。 希望有所幫助。

0

如果我正確理解您的問題,我相信這可能會起作用。

myData = Agent.read(param, function() { 
    $scope.projets[i].redacteur = myData; 
}); 

這是我用過的方法。我對Angular仍然陌生,但我的理解是myData成爲延期承諾。作爲延期承諾,必須在使用前解決。請具有更多經驗的角色和推遲的承諾編鐘。