2010-11-23 3 views
1

안녕하세요, 저는 jQuery each() - ajax 요청을 포함하는 루프와 setTimeout을 처리하고 있습니다. 그것은 저에게 프로그램 흐름에 몇 가지 문제점을줍니다.각 루프가 완료된 후 함수 실행

xml_queries: function (data) { 
    var values = []; 

    // ... 

    $.each(data, function(index, value) { 

     // ... 

     // Start xml query 
     var i = 0; 
     get_data(value.value); 

     function get_data(value) { 
      $.ajax({ 
       type: 'POST', 
       url: '/admin/scanner/get_music_data/' + value, 
       dataTaype: 'json', 
       success: function(response) { 
        if (response === 'FALSE') { 
         // Start recursion - up to 3 Retries 
         if (++i <= 3) { 
          setTimeout(function() { 
           get_data(); 
          }, 100); 
         } else { 
          // ... 
         } 
        } else { 
         values.push(response); 
        } 
       } 
      }); 
     } 
    }); 
    // return values; 
    console.log(values); 
} 

내 문제 (루프가 계속 데이터를 처리하는 동안)의 마지막 줄에서 CONSOLE.LOG()가 immediatly 소성이다. 루프가 끝날 때까지 기다릴 쉬운 가능성이 없습니까? \ :

감사합니다.

+0

그것은 일반적인 아약스 - 인 - 비동기 문제의 재 설계하는 것입니다. 이 점에 관해서는 ** 톤 **의 질문이 있습니다. –

답변

1

현재 코드를 기반으로 가장 직접적인 방법은 $ .ajax의 async 옵션을 false로 설정하여 동기식 요청을 강제 실행하여 후속 명령문을 계속 실행하기 전에 JavaScript가 완료 될 때까지 기다리게합니다 비동기 요청에 대해서는이 작업을 수행하지 마십시오.

$.ajax(
    { 
    type: 'POST', 
    async: false, 
    ... 

이렇게하면 각 요청이 지속되는 동안 브라우저가 차단됩니다. 그것을 할 수있는 또 다른 방법은 다음 아약스 호출이 최초의 성공 콜백 내에서 호출되도록 응용 프로그램, 예컨대 :

$.ajax(
    { 
    type: 'POST', 
    ... 
    success: function() { 
     doAjaxThingie(); 
    } 
+1

비동기 동작을 설명하는 것이 더 나을 것입니다. 그러나이 질문들 중 나는 피곤합니다. –

+0

고마워요. 아주 간단했습니다. 해결책을 찾기 위해 내 시도에서 setTimeout이 그 문제를 일으킬 것이라고 읽었습니다. Btw : synchrone 처리가 여러 스레드에서 수행됩니까? –

+0

@Matt - 공정합니다. 나는 적어도 6 ~ 7 번 대답했다. 반복적으로 올라오고있는 이유 중 하나는 이러한 질문의 표현이 매우 모순되어서 인터넷 검색으로 찾기가 어려워 보이는 것입니다. 아마도 우리는 추가 태그 '비동기'를 얻을 수 있도록 SO에 대한 정책을 설정해야합니다. – karim79

관련 문제