2013-08-23 62 views
5

Tôi hiện đang sử dụng một công cụ để truy xuất địa chỉ trong cơ sở dữ liệu trên nhấn phím sự kiện jQuery. Khi đầu vào văn bản mất tiêu điểm, tôi hủy mọi yêu cầu đang chờ xử lý để tránh trình đơn thả xuống xuất hiện sau khi người dùng hoàn tất để điền thông tin vào. Mọi thứ hoạt động chính xác, nhưng, để hoàn thành, tôi gửi yêu cầu ajax cuối cùng để chuyển sang bước tiếp theo của biểu mẫu của tôi. Yêu cầu này thực sự chậm hơn nhiều so với trước khi tôi hủy tất cả các yêu cầu này. Tôi không hiểu tại sao, yêu cầu bị hủy không ảnh hưởng đến yêu cầu đang chờ xử lý (và tôi chắc chắn rằng chúng bị hủy, tìm kiếm trong tab mạng trong công cụ chrome). Tôi đang sử dụng mã này:Yêu cầu jQuery ajax bị hủy làm chậm yêu cầu hiện tại

jQuery.xhrPool = []; 
jQuery.xhrPool.abortAll = function() { 
    jQuery(this).each(function(idx, jqXHR) { 
     jqXHR.abort(); 
     jQuery('.loader').hide(); 
    }); 
}; 

jQuery.ajaxSetup({ 
    beforeSend: function(jqXHR) { 
     jQuery.xhrPool.push(jqXHR); 
    }, 
    complete: function(jqXHR) { 
     var index = jQuery.xhrPool.indexOf(jqXHR); 
     if (index > -1) { 
      jQuery.xhrPool.splice(index, 1); 
     } 
    } 
}); 

jQuery('#my_input').blur(function(){ 
    jQuery.xhrPool.abortAll(); 
}); 

Tôi đoán có một mẹo tối ưu hóa mà tôi không nhận được. Cảm ơn sự giúp đỡ của bạn.

+0

Nếu bạn không hủy chúng, sự chậm trễ vẫn còn đó? –

+0

Nó chậm hơn nhiều so với khi tôi hủy chúng. – M4nch4k

+0

Và điều gì sẽ xảy ra nếu bạn gửi yêu cầu đó mà không gửi bất kỳ yêu cầu nào trước đây mà bạn đang hủy ngay từ đầu? Tôi nghi ngờ các yêu cầu bị hủy không có gì liên quan đến việc bạn gặp phải vấn đề trong bao lâu. –

Trả lời

3

Ghi quá rằng việc mở một yêu cầu AJAX đến máy chủ, và sau đó hủy bỏ yêu cầu sẽ không hủy yêu cầu xử lý trên máy chủ, nó chỉ đơn giản là dừng trình duyệt để nghe phản hồi. Máy chủ sẽ tiếp tục xử lý mọi yêu cầu ajax bị ngắt kết nối cho đến khi chúng kết thúc chạy, tại thời điểm đó nó cố gửi phản hồi tới máy khách và không tìm thấy ai nghe, chết.

+1

Đây là một điểm tuyệt vời, và sẽ là trường hợp nếu ngôn ngữ phía máy chủ xử lý các phiên tương tự như cách php thực hiện. –

+0

Cũng quên đề cập, giới hạn yêu cầu AJAX của trình duyệt có thể có nghĩa là nếu bạn thực hiện bốn yêu cầu và yêu cầu cuối cùng là thứ năm, tùy thuộc vào trình duyệt giới hạn yêu cầu thứ năm sẽ treo cho đến khi một trong bốn yêu cầu còn lại hoàn thành. – Mark

0
jQuery('#my_input').focusout(function(){ 
    jQuery.xhrPool.abortAll(); 
});  

mờ sự kiện ở chỗ nó hỗ trợ việc phát hiện sự mất tập trung từ các yếu tố cha mẹ

blur vs focusout -- any real differences?

Các vấn đề liên quan