jQuery放弃了所有杰出的AJAX请求

时间:2010-07-22 20:20:01

标签: jquery ajax

有没有简单的方法可以放弃所有优秀的jQuery AJAX请求?我的应用程序能够提取大量的同步请求,因此竞争变得有问题。我已经提出了一些hackish解决方案(即,根据请求完成时放入一个标记),但是如果全局停止所有未完成的请求功能会更好。

6 个答案:

答案 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);
        }
    }
});
相关问题