jQuery放弃所有未完成的AJAX请求

jQuery放弃所有未完成的AJAX请求,jquery,ajax,Jquery,Ajax,有没有什么简单的方法可以放弃所有未完成的jQueryAjax请求?我的应用程序能够同时处理很多请求,所以竞争就成了问题。我已经加入了黑客解决方案(即,在请求完成时加入一个被检查的标志),但是获得一个全局停止所有未完成的请求功能会更好。我想说的是将所有ajax请求存储在一个数组中。当需要终止时,只需循环遍历数组中的所有值并调用abort()。当请求完成或中止时,只需从数组中弹出即可。XMLHttpRequest有一个abort()函数。$。ajax让您能够掌握xhr对象。保留所有未完成的xhr的记

有没有什么简单的方法可以放弃所有未完成的jQueryAjax请求?我的应用程序能够同时处理很多请求,所以竞争就成了问题。我已经加入了黑客解决方案(即,在请求完成时加入一个被检查的标志),但是获得一个全局停止所有未完成的请求功能会更好。

我想说的是将所有ajax请求存储在一个数组中。当需要终止时,只需循环遍历数组中的所有值并调用abort()。当请求完成或中止时,只需从数组中弹出即可。

XMLHttpRequest有一个abort()函数。$。ajax让您能够掌握xhr对象。保留所有未完成的xhr的记录,并对任何要终止的请求执行
xhr.abort()

将每个ajax请求分配为数组元素:

var requests = [];

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

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

正如其他人所说,使用.abort()方法。但是,这仅适用于同一域内的调用。一旦进入跨站点调用(使用jsonp),那么.abort()方法将被委托为null,因此实际上不会启动/工作

值得注意的是,这让我花了很多时间调试小月亮:)


jim

基于Ken Redler的解决方案,我在初始化中加入了以下内容:

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
  }
})
我在代码段中加入了
new\u request\u list
,只是为了防止全局变量被完整的XHR对象挤满。它与上面的基本相同,只是在每个请求完成后将删除它们。上述解决方案只是不断添加到阵列中。因此,随着时间的推移,如果您进行大量ajax调用,它可能会变得巨大。调用
$.xhrPool.abortAll()当您要中止所有未完成的请求时

// $.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);
        }
    }
});

安德斯-很高兴。。。(但请检查IE的最新状态,因为在我的情况下,IE中的XMLHttpRequest主要是浏览器不可知的问题)。我似乎记得在x站点调用中中止“超时”设置为0。无论如何……)谢谢这似乎成功了。我选择了一个稍有不同的实现,我详细介绍了我将把cleanup函数放在
$.ajaxSetup
xhr.onreadystatechange
中的实现,但我担心这会干扰jQuery本身所做的任何事情。这个解决方案似乎很有效。