代码之家  ›  专栏  ›  技术社区  ›  Steven

jQuery放弃所有未完成的AJAX请求

  •  7
  • Steven  · 技术社区  · 14 年前

    有什么简单的方法可以放弃所有未完成的jqueryajax请求吗?我的应用程序能够同时处理很多请求,所以race就成了问题。我已经提出了一些黑客解决方案(即,在请求完成时加入一个被检查的标志),但是如果能得到一个全局停止所有未完成请求的函数,那就更好了。

    6 回复  |  直到 14 年前
        1
  •  12
  •   Ken Redler    10 年前

    将每个ajax请求分配为数组的一个元素:

    var requests = [];
    
    requests.push($.ajax({
        type: 'POST',
        url: '...',
        success: successfunc
        });
    );
    

    还有杀人:

    $.each(requests, function(i, v) {
        v.abort();
    });
    
        2
  •  3
  •   jim tollan    14 年前

    正如其他人所说,使用.abort()方法。但是,这只适用于同一域中的调用。一旦进入跨站点调用(使用jsonp),那么.abort()方法将被委托为null,因此实际上不会启动/工作。

    值得一提的是,这让我无休无止地调试了很多次以前的小月亮:)

    吉姆

        3
  •  3
  •   Steven    14 年前

    基于Ken Redler的解决方案,我将此放在初始化中:

    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对象挤满。

        4
  •  2
  •   Scott Evernden    14 年前

    XMLHttpRequest有一个abort()函数。$。ajax让您可以使用xhr对象。记录所有未完成的xhr,然后继续 xhr.abort() 任何你想终止的协议。

        5
  •  1
  •   spinon    14 年前

        6
  •  1
  •   Chuck Schneider    11 年前

    我发现下面的 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);
            }
        }
    });