2016-11-30 169 views
0

我在我的Django項目中使用Select2選擇框。如果您只在查詢框中輸入了一個或兩個字符,那麼ajax稱它爲相當耗時,但如果您輸入了多個字符,則速度會更快。所以我看到的是你會開始輸入一個查詢,並且它會進行4或5個Ajax調用,但是最後一個會返回並顯示結果。它在屏幕上看起來很好,但與此同時,服務器仍在攪動早期的查詢。我已經將「延遲」參數增加到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') 

但Django的一部分一邊 - 我會做什麼:在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