全局中止所有jQuery AJAX请求

时间:2010-08-11 08:00:27

标签: javascript jquery

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

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

4 个答案:

答案 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);
        }
    }
});

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

答案 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'
}