2010-08-15 6 views
3

필터를 변경하면 결과 집합을 업데이트하라는 ajax 요청을 발생시키는 검색 필터가 있습니다. 사용자가 한 번에 많은 필터를 변경하여 많은 AJAX 요청을 실행하는 경우가 종종 있습니다.jQuery 이전 요청이 모두 중단 되더라도 AJAX 요청이 느림

그래서 새 요청이 작성되면 (ajax.abort() 함수를 사용하여) 이전 요청을 중단하기로 결정했습니다. 이제 ... 파이어 버그는 모든 요청을 중단 된 것으로 표시하지만 마지막 요청 (중단되지 않은 유일한 요청)은 중단되기 전에 요청이 오래 걸립니다.

예를 들어 필터를 하나만 변경하면 요청을로드하는 데 1 초가 걸립니다. 그러나 한 번에 5 개의 필터를 변경하면 마지막 요청 만 남겨두고 4 개를 중단합니다. 그러나이 요청은 완료하는 데 5 초가 소요됩니다.

누구나 알고 계십니까? 나는 jQuery가 요청을 중단하더라도 내 서버가 여전히 그것을 처리하고 있다고 생각한다. (필자는 개발 모드에서 로컬 Rails Mongrel을 실행하고 있습니다.) 그런 이유로 내가 요청을 중단 한 모든 이유를 이기고 ...이 문제를 해결하기 위해 무엇을 할 수 있습니까 ??

도움을 많이 받으실 수 있습니다!

+0

서버가 아직 이전 요청을 처리하지 않고 그 쪽이 수렁에 빠졌습니까? –

+0

Nick Craver가 언급했듯이 AJAX 요청을 취소하면 콜백 핸들러 만 파괴되므로 페이지에서 들어오는 정보를 무시하게됩니다. 그러나 AJAX 요청을 보내 자마자 요청이 이미 서버로 전송되어 처리됩니다. 그러나 서버의 트래픽이 많지 않거나 속도가 느린 경우가 아니면 문제가되지는 않습니다. –

+0

hmmm 그래서 제작 서버로 밀어 넣었습니다. 제대로 작동하기 때문에 서버가 필터를 클릭하는 것보다 서버가 빨리 응답하기 때문에 문제가되지 않습니다. 당신이 말했듯이, 느린 로컬 개발 서버에만 문제가 있습니다. 여전히,이 일을 더 나은 방법이 있어야합니다 (우리 서버가 사용하지 않는 요청을 처리해야하는 이유는 무엇입니까?) 아마도 지연된 요청으로 앤디의 대답을 시도 할 것입니다 ... –

답변

1

사용자의 검색 매개 변수가 빠르게 입력되는 경우 요청을 지연하여 접근 할 수 있습니다. 예를 들어, 내 응용 프로그램 중 하나에서 사용자가 0.5 초 동안 멈출 때까지 기다립니다.

$("#user_login").keypress(function() { 
    var login = this; 
    if (this.value != this.lastValue) { 
     $("#loading_small").addClass("loading-small"); 
     if (this.timer) { clearTimeout(this.timer); } 
     this.timer = setTimeout(function() { 
     $.get("https://stackoverflow.com/users/login_validate", $(login).serialize(), function(data) { 
      $("#loading_small").removeClass("loading-small"); 
      $("#login_valid").fadeIn().html(data); 
     }); 
     }, 500); 
    } 
    }); 
+0

좋은 해결책 같아 보입니다. 해킹의 내 마음에 더 ... 나는 그 요청을 처리하는 중지하는 서버를 말할 수있는 방법이 있어야 같은 느낌 ...하지만 나는 거기에 추측하고있어. 쓸데없는 요청이 많아지면 스케일링 문제가 발생할 수 있습니다. –

+0

내가 해킹이라고 부를지는 모르겠다. 기본적으로 "요청하기 전에 사용자가 0.5 초 동안 타이핑을 멈추기를 기다린다. 이전 요청을 취소하도록 요청하는 서버에 더 많은 요청을 보내는 것이 좋습니다. –

관련 문제