JQuery在Chrome中停止和等待ajax请求

时间:2015-01-18 13:25:43

标签: jquery ajax google-chrome xmlhttprequest

偶尔,我的应用程序中的Ajax调用(通过JQuery 1.8)会遇到状态"待定"很长一段时间(有时长达17分钟)。 我用Google搜索了所有可行的解决方案并没有成功:

  1. 我没有安装广告拦截器。
  2. 我已禁用"预测网络操作以提高网页加载效果" Chrome中的旗帜。
  3. 我还在Ajax调用中添加了一个查询字符串,使其唯一(禁用任何Chrome缓存锁定)。
  4. 你知道如何解决这个问题吗? 感谢。

    在下面的示例中,请求处于待处理状态17分钟(与Fiddler确认它仅在17分钟后发送)。

       GET http://www.mywebsite.com/foo/rest/publishers/1/packages?_=1421584749323    HTTP/1.1
       Host: www.mywebsite.com
       Connection: keep-alive
       Accept: application/json, text/javascript, */*; q=0.01
       X-Requested-With: XMLHttpRequest
       User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36    (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36
       Content-Type: application/json
       Referer: http://www.mywebsite.com/foo/client/home
       Accept-Encoding: gzip, deflate, sdch
       Accept-Language: en-US,en;q=0.8,he;q=0.6,ru;q=0.4
       Cookie: JSESSIONID=C668509B5AFCDEBE9C9774C4721AFB9D;
       aaassz="ddss"
    

    见图片: https://drive.google.com/file/d/0B9uQiZLJG1csNzlPcHZEWHl1Z2c/view

4 个答案:

答案 0 :(得分:7)

我偶然发现了同样的问题。我一旦禁用:

  

使用预测服务更快地加载页面

转到高级设置 - >隐私 - >约第三个复选框,一切都开始工作了。我无法重现错误。

jquery/ajax轮询器在Firefox中完美运行。它只是Chrome--在Linux和Linux上测试过视窗。

这不是一个完美的解决方案,因为它不会影响全球意义上的用户 - 但也许你和我有相同的情况 - 有限的受众。

答案 1 :(得分:3)

你可以试试这个。

现在更新了实际工作代码

(使用了我自己的一些时区代码,请原谅对时区的引用)

首先初始化数组并运行请求计数逻辑

var request = ( typeof request != 'undefined' && request instanceof Array ) ? request : [];
var pendingAjax = ( typeof pendingAjax != 'undefined' && pendingAjax instanceof Array ) ? pendingAjax : [];

使用.ajaxStart.ajaxStop来跟踪有效请求。

var ajaxActive = 0;
$( document ).ajaxStart(function() {
  ajaxActive++;
  document.ajaxQueueFull = ajaxActive > 5;
});
$(document).ajaxStop(function() {
  ajaxActive--;
  document.ajaxQueueFull = ajaxActive > 5;
}

创建一个用于构建新请求的函数

    function ajaxRequestNew(t, u, d, s) {

        var instance = request.length + 1;
        request[instance] = $.ajax({
            method: t,
            url: u,
            data: {ajaxPost: d },
            success: s
        });
        return instance;
    }

现在创建获取实例编号的请求

    var instance = ajaxRequestNew('POST', 
                                  'js/ajax_timezone.php', 
                                  { ajaxAction : "ajaxGetTimezone", 
                                    tzoffset : "0", 
                                    tztimezone: "America/New_York" },
                                    function(data) {  }
    );

$ .ajax()函数返回XMLHttpRequest对象。因此,我们使用while循环来检查我们的ajax实际发送的时间,并在请求停止时中止其他活动请求。

    while(request[instance] === null || (request[instance].readyState < 1 || request[instance].readyState > 4)) {
        if (document.ajaxQueueFull) {
            //abort existing requests
            $.each(request, function(i,v) {
                if (i !== instance) {
                    request[i].abort();
                }
            });
        }
    }

将您的请求推送到堆栈

    pendingAjax.push(request[instance]);

为您的请求创建回调

  var timezoneFailCallback = function(data) {
        console.log('fail');
        console.dir(data);
    };

    var timezoneSuccessCallback = function(data) {
        console.log('success');
        console.dir(data);
    };

使用何时应用回调

    $.when.apply($, pendingAjax).done( timezoneSuccessCallback ).fail( timezoneFailCallback);

代码可能需要对您的应用进行一些调整,但希望您明白了。如果您有任何疑问,请告诉我。

答案 2 :(得分:2)

我知道这是一个旧主题,但是我正在为那些努力寻找某种答案的人发布此帖子。 我也不得不处理这种刮擦头。我的问题是由于广告拦截器阻止了其中包含“优惠券”字样的API调用。它阻止了请求,同时保持了请求的生命。在几个区块之后,每个请求都会自动变为待处理状态,因为有太多(大约6或7个)实时请求。

在Chrome地址栏中输入chrome:// net-internals /#events来检查请求。这样可以使您更清楚地了解问题。 我附上了我试图弄清楚时捕获的两张图像。

debugger screenshot

net-internal screenshot

答案 3 :(得分:1)

如果您控制服务器端,则这可能适用于您的情况: 添加到服务器的响应 headers ['Connection'] ='close' 就我而言,“保持活跃”是问题的原因