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

偶尔,我的应用程序中的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" 

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

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

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

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

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

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

你可以试试这个。

现在更新了实际工作代码

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

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

 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); 

代码可能需要对您的应用进行一些调整,但希望您能得到这个想法。 如果您有任何疑问,请告诉我。

我知道这是一个旧post,但我正在为那些争先恐后寻找某种答案的人发帖。 我不得不处理这个头部刮擦。 我的问题是由于广告拦截器阻止了一个API调用,其中包含“优惠券”一词。 它阻止了请求,同时保持活着。 在几个块之后,每个请求都会自动进入挂起状态,因为有太多(我认为大约6或7个)实时请求。

在Chrome地址栏中键入chrome:// net-internals /#events以检查请求。 这将使您更清楚地了解问题。 我附上了两张我拍摄的图像,当时我试图弄明白这一点。

调试器截图

网内截图