2010-08-11 52 views
16

有没有办法在请求对象没有句柄的情况下全局中止所有的Ajax请求?全局中止所有jQuery AJAX请求

我问的原因是我们有一个相当复杂的应用程序,我们使用setTimeOut()在后台运行多个不同的Ajax请求。如果用户点击某个按钮,我们需要停止所有正在进行的请求。

+1

的可能重复[停止jQuery中所有活动的Ajax请求(http://stackoverflow.com/questions/1802936/stop-all- activejax-requests-in-jquery) – Shoban 2010-08-11 08:07:05

+0

@shoban,但我认为如果你没有处理它们,RobertW会问是否有办法。 – 7wp 2010-08-11 08:10:29

+0

此问题可能为您提供您正在寻找什么http://stackoverflow.com/questions/1802936/stop-all-active-ajax-requests-in-jquery – codingbadger 2010-08-11 08:04:09

回答

11

你需要调用abort()方法:

var request = $.ajax({ 
    type: 'POST', 
    url: 'someurl', 
    success: function(result){..........} 
}); 

之后,你可以中止请求:

request.abort(); 

这样,你需要创建一个变量为您的Ajax请求,然后就可以使用在任何时候中止请求的abort方法。

也看看:

+0

要中止多个ajax请求尝试:http:// stackoverflow .com/a/42312101/3818394 – 2017-02-18 07:01:51

7

你不能中止所有活动的Ajax请求,如果您不跟踪把手给他们。

但是,如果您正在跟踪它,那么您可以通过循环处理程序并在每个处理程序上调用.abort()来做到这一点。

3

你可以使用这个脚本:

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

检查结果在http://jsfiddle.net/s4pbn/3/

+8

您复制了[here](http://stackoverflow.com/a/8841412/1767377)并将其粘贴到此处。虽然我很欣赏jsfiddle ** - 1,因为你没有在信用到期时给予信用。**而现在对于电影报价:“羞辱你,侮辱你的牛,侮辱你的叔叔......“-Mulan – SyntaxRules 2013-08-08 15:53:57

+0

abortAll方法在这里只能使用一次,因为$ .xhrPool = [];会销毁方法,如果你想多次使用它,你可以使用$ .xhrPool.length = 0;而不是 – igrek 2013-10-02 11:49:57

+2

有关详细信息,请参阅http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript – igrek 2013-10-02 11:54:42

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();中止它们全部。确保你将一个.fail(jqXHRFailCallback)添加到你的ajax请求中。回调将得到“中止”作为textStatus所以你知道发生了什么:

function jqXHRFailCallback(jqXHR, textStatus){ 
    // textStatus === 'abort' 
} 
+0

使用ajaxSetup不是“错误”,但你不知道它会发生导致问题,直到它......并且有时当它发生时,真的很难记住它是与你混淆的ajaxSetup。:-) +1这个答案不使用ajaxSetup。 – 2016-04-22 14:57:05