2012-04-18 2 views
0

이 코드는 중단됩니다.클로저를 사용하여 동기식 JavaScript 강제 적용

익명 함수의 응답이 외부 범위와 연결되지 않은 새 변수이기 때문에 적절하다고 확신합니다. 어떻게 해결할 수 있습니까?

function foo() { //... 

    var url = "http://urliciously-urlish-url" 
    response = null; 
    $.get(url, function (data) {response = data; 
           }); 

    while(response === null) 
    { 
     1; 
    } 
    console.log(response); 

    //... 
} 

참고 나는 응답이 null이 아닌 될 때까지이 디자인은 (폴링 시스템을위한 평소와 같이) 페이지를 중단됩니다 것을 알고 있습니다. 이런 맥락에서는 괜찮습니다.

+0

$ .get이 물건을 반품하고 있음을 확인 했습니까? –

+0

@Cris : 예, URL이 정확합니다. –

+0

아래의 답변은 정확합니다. 일반적으로 비동기 적으로 작성하는 것이 좋습니다. 단점이 있습니다. URL이 정확하다고해서 크롬 검사기, 피들러를 사용하는 것이 현명하지 않다는 의미는 아닙니다. 당신이 데이터를 받고 있는지 확인하기위한 다른 것. –

답변

3

$.get은 비동기입니다. 당신이 정말로이 동기가되고 싶어요 경우, $.ajax 기능을 사용해야합니다 :

말했다되고 그건
$.ajax({ 
    url: url, 
    async: false, 
    success: function(data) { 
     response = data; 
    } 
}); 

, 나는 차오 동의를 - 당신은 비동기 코드를 작성에 익숙해합니다.

1

코드가 실행되는 동안 이벤트 처리기는 실행되지 않습니다.

번역 :이 코드는 작동하지 않습니다.

JS를 사용하려는 경우 거의 비동기 코드 작성에 익숙해 져야합니다.

0

아니요, 문제는 JS 스레드가 계속 실행 중이므로 콜백이 실행되지 않는다는 것입니다. 현재 컨텍스트가 종료 될 때까지 기다린 다음 "다음 틱"(콜백)을 실행합니다. 틱 사이에서 DOM을 업데이트하고 다른 것들도 처리 할 수 ​​있습니다.

매달려있는 루프를 사용하는 대신 synchronous ajax request (예, 가능합니다)을 사용하십시오. jQuery : {async:false}. 그러나 요청이 끝날 때까지 "만"중단됩니다. 그리고 응답하지 않는 GUI는 일어날 최악의 일이므로 사용하지 마십시오.