2011-11-05 34 views
31

Olası Çoğalt:Uçuş sırasında AJAX isteklerini Jquery .ajax kullanarak iptal etme?

$("#friend_search").keyup(function() { 

    if($(this).val().length > 0) { 
     obtainFriendlist($(this).val()); 
    } else { 
     obtainFriendlist(""); 
    } 

}); 

function obtainFriendlist(strseg) { 

    $.ajax({ 
     type: "GET", 
     url: "getFriendlist.php", 
     data: "search="+strseg, 
     success: function(msg){ 
     UIDisplayFriends(msg); 
     } 
    }); 
} 

Esasen, bir keyup olay fonksiyonu obtainFriendlist dönmeden önce ateş ise: İşte
Kill Ajax requests using JavaScript using jQuery

ile çalışıyorum basit bir koddur bir sonuç (ve UIDisplayFriends'ı (msg) tetikler, uçuş isteğini iptal etmem gerekiyor.Çalıştığım konu şu ki Sonra, UIDisplayFriends'ın işlevi tekrar tekrar tetiklenir.

Çok teşekkür ederim ve danışma yararlıdır çok

cevap

19

$.ajax dönüş değeri eylemleri çağırabilir bir XHR nesnedir. Eğer böyle bir şey yapsın işlevini durdurmak için:

var xhr = $.ajax(...) 
... 
xhr.abort() 

sunucudaki yükü hafifletmek için de bazı zıplamaölçer eklemek akıllı olabilir. Aşağıdakiler yalnızca kullanıcı 100ms için yazmayı durdurduktan sonra bir XHR çağrısı gönderecektir.

var delay = 100, 
    handle = null; 

$("#friend_search").keyup(function() { 
    var that = this; 
    clearTimeout(handle); 
    handle = setTimeout(function() { 
     if($(that).val().length > 0) { 
      obtainFriendlist($(that).val()); 
     } else { 
      obtainFriendlist(""); 
     } 
    }, delay); 
}); 

gerçekten olup olmadığını isteğine dayanarak XHR yanıtları filtrelediğini yapıyor olması gereken bir üçüncü şey hala geçerli:

var lastXHR, lastStrseg; 

function obtainFriendlist(strseg) { 
    // Kill the last XHR request if it still exists. 
    lastXHR && lastXHR.abort && lastXHR.abort(); 

    lastStrseg = strseg; 
    lastXHR = $.ajax({ 
     type: "GET", 
     url: "getFriendlist.php", 
     data: "search="+strseg, 
     success: function(msg){ 

     // Only display friends if the search is the last search. 
     if(lastStrseg == strseg) 
      UIDisplayFriends(msg); 
     } 
    }); 
} 
+1

Gecikme ile yaptığınız şeyden hoşlanıyorum, bu hoş. Ancak, kullanıcı yavaş bir yazarsa isteklerin yığılması riski her tuş vuruşuyla yeni bir ajax isteğini tetikleme riski taşımıyor mu? –

+1

Yine de bir risk olurdu, bu nedenle her iki stratejiyi uygulamak, eski sorguyu iptal etmek ve sunucu çağrılarını azaltmak için yukarıdaki yöntemi kullanmak istersiniz. Üçüncü bir ekran, çıktının hala istekle eşleştiğini doğrular. –

+1

Mükemmel. teşekkürler, bu çok bilgilendirici – TaylorMac

0

Nasıl bir değişken kullanma hakkında size .ajax için beforeSend (jqXHR, ayarlar) seçeneğini kullanarak ve sonra kullanarak yoluyla true olarak ayarlanmış olduğunu, isLoading demek değişkeni false değerine ayarlamak için tam ayar. Ardından, başka bir ajax çağrısını tetiklemeden önce bu değişkeni doğrular mısınız?

var isLoading = false; 
$("#friend_search").keyup(function() { 

    if (!isLoading) { 
     if($(this).val().length > 0) { 
      obtainFriendlist($(this).val()); 
     } else { 
      obtainFriendlist(""); 
     } 
    } 

}); 

function obtainFriendlist(strseg) { 

    $.ajax({ 
     type: "GET", 
     url: "getFriendlist.php", 
     beforeSend: function() { isLoading = true; }, 
     data: "search="+strseg, 
     success: function(msg){ 
     UIDisplayFriends(msg); 
     }, 
     complete: function() { isLoading = false; } 
    }); 
} 
+1

bu zıt olmaz mı? Eğer kullanıcı XHR'den önce "TEST" yazıyorsa, E, S ve T için tuşlar dikkate alınmaz ve sunucu yanıtı sadece "T" için olur. –