2016-11-30 4 views
0

Я использую прямоугольники выбора в моем проекте Django. Вызов ajax, который он делает, может быть довольно трудоемким, если вы только вводили символ или два в поле запроса, но быстрее, если вы ввели несколько символов. Итак, что я вижу, вы начнете вводить запрос, и он будет выполнять 4 или 5 вызовов ajax, но последний возвращается и результаты отображаются. Он отлично выглядит на экране, но пока что сервер все еще сбивается с предыдущих запросов. Я увеличил параметр «delay» до 500 мс, но это все еще проблема.Отменить звонки ajax?

Есть ли способ, чтобы обработчик AJAX на сервере обнаружил, что это новый запрос от того же клиента, что и тот, который в настоящее время обрабатывается, и сообщить старшему о выходе немедленно? Из чтения других ответов здесь видно, что просто вызов .abort() на стороне клиента не останавливает выполнение запроса на стороне сервера.

ответ

1

Если они представляют собой запросы БД, которые занимают время, то в принципе ничто не остановит их, кроме остановки сервера базы данных, что, конечно, не осязаемо. Например, если это вычисление в вложенных циклах, вы можете использовать кеш, чтобы определить, был ли другой запрос отправлен от одного и того же пользователя. В основном:

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') 

Но Джанго часть в сторону - то, что я хотел бы сделать: в JS добавить условие, что, когда слово для поиска меньше 3 символов, то он ждет 0,5с (или меньше, что вам нравится) перед поиск. И если добавлен другой символ, то поиск сразу.
I.e.

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

Смежные вопросы