문제

다른 관련 질문 중 일부를 읽었습니다.비동기식 자바 스크립트 함수를 래핑하여 동기식으로 만들기위한 패턴 & JavaScript에서 비동기 이벤트를 동기화하십시오 & 더 많은 것이있을 수 있습니다). 그러나 나는 모든 가능성을 소진하고 싶습니다.

setInterval 또는 settimeout을 사용하여 비동기식 xmlhttprequest를 준 동기화로 "변환"할 수 있습니까?

AJAX 요청이 성공시 변수가 설정 될 때, 이는 while 루프 (setInterval 또는 settimeout이라고 불리는 신호, 적절한 콜백 함수)가 종료 될 것이라는 아이디어입니다. 아니면 SetInterval 및/또는 settimeout의 능력 (또는 한계)을 근본적으로 오해하고 있습니까?

도움이 되었습니까?

해결책

사실, 당신은 당신이 설명한 방식으로 setInterval과 settimeout을 사용하고 싶지 않습니다. 당신이 정말로하고 싶은 것은 중첩 된 기능을 편안하게하는 것입니다. 여기서 다소 동기식으로 쓸 수 있습니다.

예를 들어:

XHR.get(your_data, function()
   {
      //what you would have done "synchronously"
   });

성공 코드의 SetInterVal 및/또는 Settimeout (함수 본문에서 Settimeout을 다시 설정하기위한 호출)을 사용할 수 있지만, 그 접근 방식은 폴링 대신 첫 번째 콜백을 처리하는 것보다 크게 열등합니다. 대기 시간을 소개하고 CPU와 함께 실행되며 여러 XHR 요청에 걸쳐 확장되지 않아 몇 가지 단점을 지정합니다.

XHR은 완료되면 귀하의 기능을 호출 할 것입니다. "아직 완료 되었습니까? 아직 완료 되었습니까?" 그 동안. 반면에 정기적 인 동작이 있으면 응답이 돌아올 때까지 차단하고자하는 (예 : 데이터를 실행 해야하는 애니메이션) if 문의 차단 코드를 둘러싸는 것이 완전히 허용됩니다.

var tick = window.setTimeout(tock, 20);
var tock = function()
{
   if (response_done)
   {
      // dependent code
   }
   tick = window.setTimeout(tock, 20);
}
XHR.get(your_data, function() { /*Handle response*/ response_done = true; });

다른 팁

질문을 제대로 받으면 다음 코드를 사용하여 비슷한 효과를 얻을 수 있습니다.

var computationInterval =
    window.setInterval(function() {
        // do a computation cycle, as if you're in the body of a while loop
    }, 100);

$.get('http://example.com/areWeThereYet', function() {
    // break the intervals (the pseudo-cycle)
    window.clearInterval(computationInterval);
});
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top