2010-12-03 8 views
9

비동기 함수 호출에서 상태를 반환하는 JavaScript 함수를 작성해야합니다. 그러나 호출자는 값만 수신하며 콜백 기능은 제공되지 않습니다. ...JavaScript에서 비동기 함수를 차단하는 방법

어떤 아이디어 그러나

function getState() { 
    var ret = null; 
    asyncCall("request", 
     function() { ret = "foo"; } // callback 
    ); 
    while (ret === null) 
     ; // block on the asynchronous call 
    return ret; 
} 

, 루프가 결코 끝날 것 없다 : 내가 좋아하는 뭔가를 시도? 고맙습니다.

+2

왜 비동기 호출을 먼저 차단 하시겠습니까? 이렇게하는 것은 말이되지 않습니다. – Tomalak

+1

@Tomolak : Firefox에서 제공하는 전화이므로 변경할 수 없습니다. 대부분의 밀리 초가 소요될 것으로 예상되며,이 때문에 모든 다른 코드를 리팩토링하지 않으려합니다. –

+0

getState()를 호출하는 함수를 게시 할 수 있습니까? – Tomalak

답변

8

나는 당신이 그것은 당신이, 당신이 쓴 정확히처럼 비동기 코드를 "조율"그것을 조심하십시오 할 수 있습니다 http://stratifiedjs.org , StratifiedJS 찾고있는 생각을 동기 코드처럼 "기록" , 나머지 응용 프로그램은 차단되지 않습니다. apollo js 라이브러리를로드하여 어디에서나 사용할 수 있습니다. http://onilabs.com/modules#http

function getState() { 
    return http.get("request"); 
} 
+0

외부 파서를 사용하지만이 방법이 가장 좋은 방법입니다. –

+0

그럴 수 있습니다. 그러나 웅장한 계획에서 그것은 많은 오버 헤드를 추가하지 않습니다. – tomg

0

왜 그냥 :

asyncCall("request", function() { 
    // here you can inspect the state 
}); 

래퍼 함수의 포인트는 무엇입니까?

비동기 함수는 이러한 방식으로 작동합니다. 당신이 실행을 차단하려는 경우, 동기 호출을 사용

var state = syncCall("request"); 
+0

여러 플랫폼에서 작업하고 있기 때문에 라이브러리와 비슷합니다. 나머지 코드는이 특별한 정보를 기다려야합니다. 동기 대체가 제공되지 않습니다. –

+0

@ryanli 그런 다음 나머지 코드를 콜백에 넣으십시오. –

+1

@ ime : 비동기 호출이 호출하는 다른 모든 코드를 감염시킬 수 있습니다. 이 비동기 호출을 차단하는 방법이 있는지 알고 싶습니다. –

1

최고는 콜백 함수로 불렀다 할 논리를 넣어하는 것입니다. 왜 그렇게 할 수없는 이유가 있습니까? 그 좋은 생각이 할 수 있도록 당신이 일을하려고하는 것은 동기 전화 인

+0

일반 문서 JavaScript가 아닌 확장 기능을 작성 중입니다. 함수의 나머지 부분은이 상태에 의존하며 제공된 유일한 것은 비동기 함수입니다. –

1

내가 오해하지 않는 :

function getState() { 
    waitfor (var ret) { 
    // block on the asynchronous call 
    asyncCall("request", resume); 
    } 
    return ret; 
} 

물론 그냥 같이 만들 것이다 모듈/라이브러리이 있습니다

은 층화 자바 스크립트에서 어떻게 보이는지이다 귀하의 질문에, 당신은 jQuery의 ajaxStop() 이벤트 - http://api.jquery.com/ajaxstop 볼 수 있습니다. 모든 Ajax 호출이 완료 될 때까지 차단됩니다. 이것은 분명히 모든 비동기 호출이 jQuery를 통해 수행 될 것을 요구합니다.

$(document).ajaxStop(function() { 
    // do your "ajax dependent" stuff here 
}); 
관련 문제