有没有简单的方法可以放弃所有优秀的jQuery AJAX请求?我的应用程序能够提取大量的同步请求,因此竞争变得有问题。我已经提出了一些hackish解决方案(即,根据请求完成时放入一个标记),但是如果全局停止所有未完成的请求功能会更好。
答案 0 :(得分:12)
将每个ajax请求指定为数组的元素:
var requests = [];
requests.push($.ajax({
type: 'POST',
url: '...',
success: successfunc
});
);
要杀人:
$.each(requests, function(i, v) {
v.abort();
});
答案 1 :(得分:3)
正如其他人所说,使用.abort()方法。但是,这仅适用于同一域内的呼叫。一旦你进入跨站点调用(使用jsonp),那么.abort()方法被委托为null,因此实际上不会启动/工作。
值得注意的是,因为这导致我在很多小月前的无限调试时间:)
吉姆
答案 2 :(得分:3)
根据肯·雷德勒的解决方案,我把它放在我的初始化中:
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_request_list
添加片段只是为了防止全局变量变得拥挤已完成的XHR对象。
答案 3 :(得分:2)
XMLHttpRequest有一个abort()函数。 $ .ajax让你掌握xhr对象。记录所有未完成的xhr,并为你想要终止的任何人xhr.abort()
。
答案 4 :(得分:1)
我想说将所有ajax请求存储在一个数组中。当你需要kill时,只需遍历数组中的所有值并调用abort()。当请求完成或中止时,只需从数组中弹出。
答案 5 :(得分:1)
我在jsfiddle上找到了以下内容。它与上面大致相同,只要它们在完成后删除每个请求。上面的解决方案只是不断添加到阵列。所以随着时间的推移,如果你正在进行大量的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);
}
}
});