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