2011-11-14 2 views
0

저는 Ajax에 대해 처음 접했지만 사용의 요지는 '비동기'부분이라고 생각했습니다. 불행히도, 나는 동기 지옥에 갇혀있는 것 같습니다.모든 XHR로드가 완료 될 때까지 jQuery.ajax() 페이지로드가 완료되지 않습니까?

내 페이지의 초기에는 다수의 요소가 만들어지고 각 요소에는 고유 한 ID가 있습니다.

jQuery를 사용하여 각 요소를 반복하고 ajax() 호출을 실행합니다 (여기서 명시 적으로 'async'을 true로 설정 함). 현재 완료되면 각 Ajax 호출은 해당 요소를 텍스트 출력으로 채 웁니다. 결국 그것은 IMG가 될 것입니다.

페이지에서 "사용중"마우스 커서가 표시되고 모든 요소 (17 개)가 반환 될 때까지 특정 요소가 채워지지 않습니다.

jQuery('.ajax-item').each(function(index){ 
    $item = jQuery(this); 
    ID = $item.attr('id'); 

    //$item.load(WPGlobals.ajaxurl, { 'action' : 'my-action', 'ID' : ID }); 
    jQuery.ajax({ 
     url : WPGlobals.ajaxurl, 
     type : 'POST', 
     async : true, 
     data : { 'action' : 'my-action', 'ID' : ID }, 
     success : function(response){ $item.html(response) } 
    }); 
}); 

(위)이 코드를 보면이이 워드 프레스 사이트 (나는 그것이 무슨 상관이 될지 모른다하지만)입니다 점에 유의 할 것 :

여기 내 jQuery를 호출이다 또한 간단한 load() 방법을 시도하고 ajax()으로 전환 했으므로 async : true을 강제로 실행할 수 있습니다.이 경우 일부 WP 이상한 결과로 인해 문제가 생길 수 있습니다.

나는 올바른 방향으로 가고 있습니까? AJAX에 상관없이 내 페이지를로드해서는 안되며 XHR이 들어올 때 해당 항목이 지연되어 표시됩니다.

EDIT - 정적 호출에서 논리가 엉망임을 눈치 챘습니다. 나는 $ item을 적절하게 스코프에 넣기 위해 closure가 필요할 것이지만, 여기에는 비동기 문제까지 존재하지 않는다. 페이지로드가 완료되기 전에 17 개의 XHR을 여전히 발사하고 집에 돌아 오기를 기다린다.

+2

한 페이지에 17 개의 XHR 요청? 비동기식이든 아니든간에, 그 중 일부를 결합하는 방법을 찾아야합니다. 두 개 이상의 AJAX 요청이 서로 다른 매개 변수를 사용하여 동일한 스크립트로 이동하는 경우 서버 측 코드를 다시 작성하여 하나의 요청으로 모두 전달한 다음 jQuery로 클라이언트 쪽을 구문 분석 할 수 있어야합니다. – Blazemonger

+0

코드를 변경하여 모든 데이터 필드를 먼저 반복하고 모든 데이터 필드를 한 번에 서버로 보내고 반환 된 데이터를 처리하도록 고려할 수 있습니다. 아마 $ .each 루프와 ajax 호출이 아닌 DOM을 액세스하는 것의 조합 일 것입니다. DOM에 액세스 (각 요소를 가져 오거나, 요소의 내용을 변경하거나, 속성을 보는 등)하면 페이지의 속도가 느려지 게됩니다. – scrappedcola

답변

4

최대 요청 수가 제한되어 있다고 생각합니다. 따라서 더 많은 스레드를 사용할 수있을 때까지 브라우저가 대기하고 있습니다. 이 스레드를 확인하십시오 : How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?

+0

하! 좋은 제이크. 나는 거의 이것이 문제라는 것을 확신한다. 나에게 스레드를 몇 개 만들 수 있는지에 대한 제한이있을 수는 없습니다. 로드가 진행되는 즉시 각 요소의 내용을 표시 (결과적으로 "페이드 인")하고 싶다면 솔루션을 다시 생각해 볼 필요가 있습니다. 모든 요소를 ​​단일 Ajax 요청으로 배치하면 모든로드가 표시 될 때까지 기다려야합니다. 내 페이지가 두 단계로 나뉘어 느껴질 것입니다. –

+0

글쎄, 링크 된 스레드는 당신을 위해 여러 가지 가능한 해결책을 가지고 있습니다. –

관련 문제