2010-07-21 7 views
0

저는 지금 당황합니다. 루프 중에 값이 할당되는 간단한 변수를 사용하고 있습니다. 루프를 종료 한 후 변수 값은 아직 정의되어 있지 않습니다. 경고가 아닌 한 먼저 값을 알려줍니다. 그러면 모든 것이 잘됩니다. 무슨 일 이니?자바 스크립트 값 할당 지연?

$(myarray).each(function(idx, item) 
{ 
    fetchSomethingRemotely(success: function(data) { 
      item.someValue = data; }); 

    // if the following alert is not there, doSomething will never get called 
    // and the alert after the else will show item.someValue as undefined. 
    alert(item.someValue); 

    if (item.someValue != null) { doSomething(item.someValue); } 
    else { alert(item.someValue); } 

}); 

편집 :

좋아, 내가 지금이의 더 나은 핸들을 가지고있다. 값 할당 (item.someValue = 123)은이 반복 내에서 콜백 함수 내부에서 발생합니다. 그래서 값을 아마 내가 거기에 코드 줄을 몇 연속적으로 액세스하려고하면 아직 거기 있지 않습니다. 어떻게 값을 할당받을 수 있을까요?

+2

작성한 코드를 게시 할 수 있습니까? –

+0

이 코드의 예는 무엇입니까? – Anurag

+0

코드를 표시하십시오. – ChaosPandion

답변

5

어떻게 값을 할당 할 수 있습니까?

답변은 이미 귀하의 코드에 있습니다. doSomething을 콜백 함수로 옮기면됩니다.

fetchSomethingRemotely({ success: function(data) { 
     item.someValue = data; 
     if (item.someValue != null) doSomething(item.someValue); 
} }); 

현재 항목에 가치가 있기 전에 여전히 다음 항목으로 이동한다는 점에 유의하십시오.

function iterate(index) { 
    var item = myarray[index]; 
    fetchSomethingRemotely({ success: function(data) { 
    item.someValue = data; 
    if (item.someValue != null) doSomething(item.someValue); 
    if (index < myarray.length - 1) iterate(index + 1); 
    } }); 
} 

을 그리고 당신은 iterate(0)으로 전체 프로세스를 해고 : 당신이 반복 순차적으로 모두 수행해야하는 경우, 당신은 같은 것을 할 수 있습니다.

+0

카운터를 추가하고 (시작된 작업과 완료된 작업) 콜백에서 처리를 원하지 않았으므로 일치시킬 때까지 루프의 해당 값을 비교 한 다음 계속 진행하여 코드를 약간 다르게 해결했습니다. 그러나 이것도 좋은 해결책입니다. – Alex

+1

@Alex : 카운터가 일치 할 때까지 유휴 루프를 실행 중입니까? 브라우저가 CPU 사이클을 낭비하는 것은 말할 것도없고 단일 스레드에서 모든 JavaScript를 실행하면 잠재적으로 교착 상태가 발생할 수 있습니다 (브라우저를 정지하십시오). – casablanca

2

var을 사용하여 변수를 정의했는지 기억해 봤습니까? 해당 변수가 사용중인 범위에 있는지 확인하십시오. for (var i ...을 수행하면 범위 밖에있는 for 범위에만 존재하게됩니다. Webkit (Chrome, Safari)의 개발자 도구를 사용하여 문제 선에 중단 점을 설정하여 스크립트를 디버그 한 다음 오른쪽 열에서 관련 범위에 정의 된 모든 변수를 볼 수 있습니다.

+2

JavaScript에 블록 수준 범위가 없습니다.'for' 내부의'var '은 함수 수준 범위 또는 전역 범위를가집니다. – Anurag

+1

불행히도 중단 점을 설정할 수있는 방법이 없습니다. 어느 쪽이든 작동합니다 (경고가있는 곳) 또는 그렇지 않습니다. – Alex

+1

Anurag 좋은 지적. 추측 컨데 나는 내 인생에서 전에 그런 것을 디버깅하는 데 몇 시간을 소비한다고 썼다. 나는 모든 브라우저가 이것을 똑같이 취급하는지 궁금하다. – balupton

1

" 값은 어떻게 대기 할 수 있습니까?"

비동기 프로그래밍에 오신 것을 환영합니다!

을 변수 할당이 아닌 콜백에 넣어야합니다.