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

Was*_*fa1 22 ajax jquery google-chrome xmlhttprequest

偶尔,我的应用程序中的Ajax调用(通过JQuery 1.8)长时间处于待处理状态(有时长达17分钟).我用谷歌搜索了所有可能的解决方案都没有用:

  1. 我没有安装广告拦截器.
  2. 我已禁用Chrome中的"预测网络操作以提高页面加载性能"标记.
  3. 我还在Ajax调用中添加了一个查询字符串,使其独一无二(禁用任何Chrome缓存锁定).

你知道如何解决这个问题吗?谢谢.

在下面的示例中,请求处于待处理状态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"
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

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

进入高级设置 - >隐私 - > ca. 第三个复选框,一切都开始按预期工作.我无法重现错误.

jquery/ajax轮询完美的作品在Firefox.它只是Chrome--在Linux和Windows上测试过.

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


Tec*_*ant 4

你可以试试这个。

现已更新为实际工作代码

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

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

var request = ( typeof request != 'undefined' && request instanceof Array ) ? request : [];
var pendingAjax = ( typeof pendingAjax != 'undefined' && pendingAjax instanceof Array ) ? pendingAjax : [];
Run Code Online (Sandbox Code Playgroud)

使用.ajaxStart.ajaxStop来跟踪活动请求。

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

创建一个函数来构建新请求

    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;
    }
Run Code Online (Sandbox Code Playgroud)

现在创建您的请求,获取返回的实例编号

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

$.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();
                }
            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

将您的请求推送到堆栈上

    pendingAjax.push(request[instance]);
Run Code Online (Sandbox Code Playgroud)

为您的请求创建回调

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

    var timezoneSuccessCallback = function(data) {
        console.log('success');
        console.dir(data);
    };
Run Code Online (Sandbox Code Playgroud)

使用何时应用回调

    $.when.apply($, pendingAjax).done( timezoneSuccessCallback ).fail( timezoneFailCallback);
Run Code Online (Sandbox Code Playgroud)

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