2016-11-30 4 views
0

내 Django 프로젝트에서 Select2 선택 상자를 사용하고 있습니다. 쿼리 상자에 문자 하나 또는 두 개만 입력 한 경우 Ajax 호출은 상당히 시간 소모적 일 수 있지만 여러 문자를 입력 한 경우 더 빨리 수행됩니다. 그래서 내가보고있는 것은 당신이 쿼리를 타이핑하기 시작할 것이고, 그것은 4 ~ 5 건의 아약스 호출을 할 것이지만, 마지막 호출과 결과가 표시됩니다. 그것은 화면에 잘 보이지만, 그 사이에, 서버는 여전히 이전 쿼리를 버리고 있습니다. "지연"매개 변수를 500 밀리 초로 늘렸지만 여전히 문제가 있습니다.ajax 통화를 취소 하시겠습니까?

서버에서 AJAX 처리기가 현재 처리중인 동일한 클라이언트의 새 요청임을 감지하고 이전 버전을 즉시 종료하도록 알리는 방법이 있습니까? 클라이언트 측에서 .abort()을 호출하는 것만으로도 서버 측에서 실행되는 쿼리가 중단되지 않는다는 다른 답변을 읽은 것으로 보입니다.

답변

1

시간이 많이 소요되는 DB 쿼리 인 경우 기본적으로 데이터베이스 서버를 중지하는 것 외에는 아무것도 중지하지 않습니다. 물론 볼 수 없습니다. 예를 들어 중첩 된 루프에서 계산하는 경우 캐시를 사용하여 다른 사용자가 동일한 요청을 제출했는지 여부를 확인할 수 있습니다. 기본적으로 :

from django.core.cache import cache  

def view(request): 
    start_time = timestamp # timezone.now() etc. 
    cache.set(request.session.session_key + 'some_identifier', start_time) 
    for q in werty: 
     # Very expensive computation with millions of loops 
     if start_time != cache.get(request.session.session_key + 'some_identifier'): 
      break 
     else: 
      # Continue the nasty computations 
    else: 
     cache.delete(request.session.session_key + 'some_identifier') 

그러나 옆 장고의 일부 - 내가 어떻게 할 것인지 : 검색 단어가 3 개 미만의 문자를 때, 다음은 0.5 초를 대기하는 조건을 추가 JS으로는 (이하, 당신이 원하는대로) 전 수색. 그리고 다른 문자가 추가되면 바로 검색하십시오.
즉,

var timeout; 

function srch(param) { 
    timeout = false; 
    if (param.length < 3) { 
     timeout = true; 
     setTimeout(function() { 
      if (timeout) { 
       $.ajax({blah: blah}); 
      } 
     }, 500); 
    } else { 
     $.ajax({blah: blah}); 
    } 
} 
+0

무엇을 실제로 캐시에 값을 설정합니까? –

+0

@PaulTomblin 답변을 업데이트했습니다. 어쨌든 당신의 생각을 시작하기 위해 무작위 의사 코드가 될 예정 이었지만, 그런 종류의 것이 실제로 잘 작동해야합니다. – makaveli