2013-11-14 7 views
0

ngResource 액션 호출의 비동기 결과를 for 루프에 배열 요소에 할당하려고합니다.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

및 [자바 스크립트에서 카운터 변수에 대한 이상한 값] (http://stackoverflow.com/questions/10317495/weird-value- for-counter-variable-in-javascript) –

답변

1

나는이 문제를 클로저에 콜백 함수를 호출하여 해결했습니다. 내 예로, 그 다음과 같습니다 [? 자바 스크립트 악명 높은 루프 문제]

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 !! 당신이 여기 내 피부를 구 했어요! 이제 자바 스크립트 클로저에 대해 읽어야합니다. – Stephane

0

비슷한 문제가있어서 약정을 사용하여 해결했습니다. 기본 개념은 배열의 인덱스를 비동기 요청 콜백의 매개 변수로 보내고 응답이 도착하면 처리 할 수 ​​있다는 것입니다. 도움이 되길 바랍니다.

0

문제가 올바르게 이해되면 문제가 해결 될 수 있습니다.

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

이것은 내가 사용한 접근법입니다. 저는 Angular에서 아직 익숙하지 않지만 myData는 지연된 약속이됩니다. 지연 약속으로 사용하기 전에 해결해야합니다. 제발, 더 많은 경험을 가진 누군가가 각도 및 지연 약속을합니다.