2010-07-22 22 views
6

Có cách nào dễ dàng để từ bỏ tất cả các yêu cầu jQuery AJAX chưa xử lý không? Ứng dụng của tôi có khả năng rút ra rất nhiều yêu cầu đồng thời, do đó cuộc đua trở nên có vấn đề. Tôi đã đưa vào các giải pháp hackish (cụ thể là, đặt trong một lá cờ được kiểm tra khi yêu cầu hoàn thành), nhưng nó sẽ được nhiều đẹp hơn để có được một toàn cầu ngăn chặn tất cả các yêu cầu xuất sắc chức năng.jQuery từ bỏ tất cả các yêu cầu AJAX nổi bật

Trả lời

11

Gán mọi yêu cầu ajax như một phần tử của một mảng:

var requests = []; 

requests.push($.ajax({ 
    type: 'POST', 
    url: '...', 
    success: successfunc 
    }); 
); 

Và để giết:

$.each(requests, function(i, v) { 
    v.abort(); 
}); 
+0

Cảm ơn. Điều này dường như đã thực hiện các trick. Tôi đã chọn một triển khai hơi khác một chút mà tôi nêu chi tiết [ở đây] (http://stackoverflow.com/questions/3313059/jquery-abandon-all-outstanding-ajax-requests/3313954#3313954) –

1

Tôi có thể lưu trữ tất cả yêu cầu ajax trong một mảng. Khi bạn cần phải giết sau đó chỉ cần lặp qua tất cả các giá trị trong mảng và gọi abort(). Khi một yêu cầu được hoàn thành hoặc hủy bỏ chỉ cần bật từ mảng.

2

XMLHttpRequest có hàm abort(). $ .ajax cho phép bạn có được bàn tay của bạn trên đối tượng xhr. giữ một bản ghi của tất cả các xhr xuất sắc và đi xhr.abort() cho bất kỳ bạn muốn chấm dứt.

3

như những người khác đã nói, sử dụng phương pháp .abort(). Tuy nhiên, CHỈ này hoạt động trên các cuộc gọi trong cùng một tên miền. một khi bạn nhập vào các cuộc gọi cross-site (với jsonp), thì phương thức .abort() được gán cho null, vì vậy sẽ không thực sự cháy/làm việc.

đáng chú ý vì điều này gây cho tôi thời gian gỡ lỗi vô tận nhiều một mặt trăng nhỏ trước :)

jim

+0

Thông tin mát mẻ, cảm ơn những người đứng đầu . – Anders

+0

anders - niềm vui ... (tho 'kiểm tra trạng thái mới nhất trên IE vì nó chủ yếu là XMLHttpRequest trong IE đã là một vấn đề khi cố gắng làm cho trình duyệt bất khả tri trong trường hợp của tôi). tôi dường như nhớ rằng việc hủy bỏ 'timeout' được đặt thành 0 trên các cuộc gọi x-site. anyway .. :) –

3

Dựa trên giải pháp Ken Redler, tôi đặt này trong phần khởi tạo của tôi:

window.requests = [] 
$.ajaxSetup({ 
    beforeSend: function(xhr){ 
    var new_request_list = [xhr] 
    $.each(window.requests, function(k,v){ 
     if(v.readyState != 4) new_request_list.push(v) 
    }) 
    window.requests = new_request_list 
    } 
}) 

tôi đặt trong đoạn mã với new_request_list chỉ để giữ cho biến toàn cầu khỏi bị đông đúc với các đối tượng XHR hoàn chỉnh.

+0

Tôi sẽ đặt chức năng dọn dẹp trong '$ .ajaxSetup' hoặc' xhr.onreadystatechange', nhưng tôi lo ngại rằng điều này sẽ can thiệp vào bất kỳ jQuery nào tự làm. Giải pháp này dường như hoạt động tốt. –

1

Tôi tìm thấy thông tin sau trên jsfiddle. Nó chủ yếu giống như trên, ngoại trừ nó sẽ xóa từng yêu cầu sau khi chúng hoàn tất. Các giải pháp ở trên chỉ tiếp tục thêm vào mảng. Vì vậy, theo thời gian, nó có thể rất lớn nếu bạn đang thực hiện rất nhiều cuộc gọi ajax. Bạn gọi số $.xhrPool.abortAll(); khi bạn muốn hủy tất cả yêu cầu chưa xử lý.

// $.xhrPool and $.ajaxSetup are the solution 
$.xhrPool = []; 
$.xhrPool.abortAll = function() { 
    $(this).each(function(idx, jqXHR) { 
     jqXHR.abort(); 
    }); 
    $.xhrPool = []; 
}; 

$.ajaxSetup({ 
    beforeSend: function(jqXHR) { 
     $.xhrPool.push(jqXHR); 
    }, 
    complete: function(jqXHR) { 
     var index = $.xhrPool.indexOf(jqXHR); 
     if (index > -1) { 
      $.xhrPool.splice(index, 1); 
     } 
    } 
}); 
Các vấn đề liên quan