2010-07-22 34 views
26

Căn cứ vào: Abort Ajax requests using jQuery ... Trong inventory_search() - trước khi yêu cầu ajax được thực hiện, làm cách nào tôi có thể kiểm tra bất kỳ yêu cầu hiện tại nào và hủy() trước khi thực hiện yêu cầu mới? Hoặc là có một cách tốt hơn để làm điều này?jquery abort() ajax request trước khi gửi

<script type="text/javascript"> 

    $(function() { 
     $('form#internal_catalog').change(function() { 
      inventory_search(); 
     }); 
    }); 

    function inventory_search() { 
     var search_data = $('form#internal_catalog').serialize(); 
     var a = $.ajax({ 
      type: 'post', 
      url: '/test.php', 
      data: search_data, 
      success: function(data) { 
       $('#catalog').html(data); 
      } 
     }); 
    } 

</script> 

Trả lời

61

Tạo hàng đợi mảng cho tất cả các yêu cầu của bạn. Sau đó, nếu bạn tìm thấy một điểm mà bạn cần phải hủy bỏ tất cả các yêu cầu hiện tại, bạn chỉ có thể lặp qua mảng và gọi hủy bỏ trên tất cả các yêu cầu đang chờ xử lý. Nên khá đơn giản.

Mặc dù cách khác là chỉ giữ một cờ nội bộ cho biết yêu cầu hiện có đang xử lý hay không và bỏ qua yêu cầu nếu có. Hoặc xử lý cách bạn thấy phù hợp.

EDIT: Kiểm tra này SO câu hỏi cho một tình huống tương tự: How to avoid 3 ajax calls?

EDIT 2: Vì vậy, tôi những gì bạn có thể làm là có một mảng mà bạn thêm tất cả ajax của bạn gọi đến. Về cơ bản, chỉ cần tạo một XmlHttpRequest và đó là những gì được trả về từ cuộc gọi ajax. Vì vậy,

requests.push(
    $.ajax({ 
     type: 'post', 
     url: '/test.php', 
     data: search_data, 
     success: function(data) { 
      $('#catalog').html(data); 
     } 
    })); 

Điều này sẽ thêm tất cả yêu cầu của bạn vào mảng yêu cầu mà bạn có thể xác định ở đâu đó. Sau đó, khi bạn muốn giết tất cả các yêu cầu đang chờ xử lý, bạn chỉ có thể lặp qua mảng và hủy bỏ cuộc gọi sẽ hủy yêu cầu.

for(var i = 0; i < requests.length; i++) 
    requests[i].abort(); 

Hoặc chỉ xác định biến bên ngoài chức năng của bạn là cờ cho biết yêu cầu có được thực hiện hay không. Bạn thậm chí có thể làm cho nó cụ thể hơn và lưu trữ dữ liệu tìm kiếm và chỉ bỏ qua các yêu cầu có yêu cầu đang chờ xử lý cho cùng một dữ liệu và cho phép các yêu cầu khác dành cho dữ liệu khác nhau.

Hy vọng điều đó là đủ để bạn bắt đầu.

2

Sử dụng biến toàn cục để giữ tay cầm của yêu cầu hiện tại. Trong trường hợp này, hãy khai báo hàm var a ngoài chức năng và biến nó thành toàn cầu. Trước khi gọi ajax kiểm tra nó không phải là null. Nếu nó không phải là null abort nó khôn ngoan khác chỉ định nó với ajax mới. Trong sự kiện thành công/hoàn thành, hãy đảm bảo bạn xóa biến a. Có thể không phải là giải pháp tốt nhất hiện có, nhưng hoạt động tốt nhất.

4

Khá dễ dàng với jQuery AjaxManager Plugin:

$.manageAjax.create('unique_identifier',{ 
queue:'clear',cacheResponse:false,maxRequests:1,abortOld:true 
}); 
jQuery.manageAjax.abort('unique_identifier'); 
jQuery.manageAjax.clear('unique_identifier'); 
jQuery.manageAjax.add('unique_identifier',{success: function(data) {}}); 
23

Spinon của câu trả lời là rất tốt cho hủy tất cả các truy vấn ajax nhưng không tuyệt vời cho việc theo dõi chỉ một.

Tôi thường thấy mình làm điều gì đó như

var ajax_request; 
function do_something() 
{ 
    if(typeof ajax_request !== 'undefined') 
     ajax_request.abort(); 
    ajax_request = $.ajax({ 
     type: 'post', 
     url: '/test.php', 
     data: search_data, 
     success: function(data) { 
      $('#catalog').html(data); 
     } 
    }); 
} 
+1

+1 tôi làm điều đó sử dụng chính xác cùng một phương pháp. (ngoại trừ 'ajax_request' var name ^^) ... Và nó hoạt động tốt! – JoDev

+0

Tôi vừa thay đổi 'var ajax_request;' thành 'var ajax_request = new XMLHttpRequest();' và nó hoạt động. 1 cho ý tưởng. – smartrahat

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