Khi tôi có một callback có thể bị sa thải nhiều lần, nhưng tôi muốn chỉ sử dụng cuối cùng, tôi sử dụng mô hình này:
var resultsXHR, resultsTimer, resultsId=0;
$('input').keyup(function(){
clearTimeout(resultsTimer); // Remove any queued request
if (resultsXHR) resultsXHR.abort(); // Cancel request in progress
resultsTimer = setTimeout(function(){ // Record the queued request
var id = ++resultsId; // Record the calling order
resultsXHR = $.get('/results',function(data){ // Capture request in progress
resultsXHR = null; // This request is done
if (id!=resultsId) return; // A later request is pending
// ... actually do stuff here ...
});
},500); // Wait 500ms after keyup
});
Các mình abort()
là không đủ để ngăn chặn các cuộc gọi lại thành công từ được viện dẫn; bạn vẫn có thể tìm thấy cuộc gọi lại của mình mặc dù bạn đã cố gắng hủy yêu cầu. Đây là lý do tại sao cần sử dụng trình theo dõi resultsId
và yêu cầu xử lý dừng gọi lại của bạn nếu một trình duyệt khác, sau đó, gọi lại chồng chéo đã sẵn sàng.
Vì mức độ phổ biến và cồng kềnh này, tôi nghĩ nên kết hợp nó theo kiểu có thể sử dụng lại mà không yêu cầu bạn phải tạo ra một bộ ba tên biến cục bộ cho mỗi tên bạn muốn xử lý:
(function($){
$.fn.bindDelayedGet = function(event,delay,url,dataCallback,dataType,callback){
var xhr, timer, ct=0;
return this.bind(event,function(){
clearTimeout(timer);
if (xhr) xhr.abort();
timer = setTimeout(function(){
var id = ++ct;
xhr = $.get(url,dataCallback && dataCallback(),function(data){
xhr = null;
if (id==ct) callback(data);
},dataType);
},delay);
});
};
})(jQuery);
// In action
var inp = $('#myinput').bindDelayedGet('keyup',400,'/search',
function(){ return {term:inp.val()}; },
'html',
function(html){ $('#searchResults').clear().append(html); }
);
Bạn có thể tìm thấy mã ở trên được thảo luận chi tiết hơn on my website.
Không phải thứ tôi đã thử, nhưng phương thức get() trả về XMLHttpRequest cơ bản, có thể hủy bỏ() ed. Điều đó có giúp được không? – Andy
có thể trùng lặp của [Hủy yêu cầu ajax trước đó jquery] (http: // stackoverflow.com/questions/4342438/canceling-previous-ajax-request-jquery) – Phrogz