2013-03-31 2 views
0

coffeescirpt의 개체를 반복 할 때 범위 지정 문제가 있습니다. 배열을 반복 할 때도 비슷한 문제가 있었지만 forEach를 사용하여이를 해결할 수있었습니다. 각 루프마다 새로운 범위를 부여했습니다. 이제 배열 대신 객체/사전을 사용하는 비슷한 문제를 겪고 있습니다. 문제는 객체를 반복 할 때 마지막 객체 인 console.log이 모든 객체에 대해 객체의 마지막 사람에 대한 데이터를 반환한다는 것입니다. 이것은 범위 지정 문제라고 생각하지만 해결 방법을 모르겠습니다.CoffeeScript의 개체를 반복 할 때의 범위

for name, data of people 
    console.log name 
    do (data) -> 
     lookup name, (err, other_data) -> 
      console.log data 

답변

4

do block을 사용합니다.

조금 더 설명하기 만하면 전달중인 콜백 함수가 어떤 방식 으로든 비동기 적으로 실행되기 때문에 발생하는 문제가 있습니다. 따라서 루프가 끝까지 실행되고 끝에있는 데이터는 최종 값으로 설정됩니다. 그런 다음 비동기 콜백이 차례대로 실행되고 데이터 객체에 액세스합니다. 루프가 끝까지 실행 되었기 때문에 데이터는 항상 최종 값과 로그됩니다.

do 블록은 클로저에 대한 속기를 제공하여 문제를 해결합니다. 누트 알 코드는 자바 스크립트 다음에 변환이 경우 그래서

var data, name, _fn; 

_fn = function(data) { 
    return lookup(name, function(err, other_data) { 
    return console.log(data); 
    }); 
}; 
for (name in people) { 
    data = people[name]; 
    console.log(name); 
    _fn(data); 
} 

이 데이터의 범위에서의 전류 값을 보존하고 참조를 유지 룩업 함수를 돌려 닫는 기능에 전달 닫는 범위의 값

1

누트의 대답은 정확하고 나는 그것을 upvoted :

for name, data of people 
    console.log name 
    lookup name, (err, other_data) -> 
     console.log data # this always returns the data for the last person