有没有办法在没有请求对象句柄的情况下全局中止所有Ajax请求?
我问的原因是我们有一个非常复杂的应用程序,我们使用setTimeOut()在后台运行许多不同的Ajax请求。如果用户点击某个按钮,我们需要暂停所有正在进行的请求。
答案 0 :(得分:13)
您需要调用abort()
方法:
var request = $.ajax({
type: 'POST',
url: 'someurl',
success: function(result){..........}
});
之后您可以中止请求:
request.abort();
这样您需要为ajax请求创建一个变量,然后您可以使用abort
方法随时中止请求。
另请看:
答案 1 :(得分:7)
如果您没有跟踪它们的句柄,则无法中止所有活动的Ajax请求。
但是如果你跟踪它,那么是的,你可以通过循环处理程序并在每个处理器上调用.abort()
来实现它。
答案 2 :(得分:5)
您可以使用此脚本:
// $.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);
}
}
});
答案 3 :(得分:3)
对相关问题的回答是对我有用的:
https://stackoverflow.com/a/10701856/5114
注意@grr所说的第一行:“使用ajaxSetup不正确”
如果你想自己调用它而不是像他们那样使用window.onbeforeunload
,你可以调整他的答案来将你自己的功能添加到窗口。
// Most of this is copied from @grr verbatim:
(function($) {
var xhrPool = [];
$(document).ajaxSend(function(e, jqXHR, options){
xhrPool.push(jqXHR);
});
$(document).ajaxComplete(function(e, jqXHR, options) {
xhrPool = $.grep(xhrPool, function(x){return x!=jqXHR});
});
// I changed the name of the abort function here:
window.abortAllMyAjaxRequests = function() {
$.each(xhrPool, function(idx, jqXHR) {
jqXHR.abort();
});
};
})(jQuery);
然后你可以打电话给window.abortAllMyAjaxRequests();
让他们全部中止。确保在ajax请求中添加.fail(jqXHRFailCallback)
。回调将被“中止”为textStatus
所以你知道发生了什么:
function jqXHRFailCallback(jqXHR, textStatus){
// textStatus === 'abort'
}