偶尔,我的应用程序中的Ajax调用(通过JQuery 1.8)会遇到状态"待定"很长一段时间(有时长达17分钟)。 我用Google搜索了所有可行的解决方案并没有成功:
你知道如何解决这个问题吗? 感谢。
在下面的示例中,请求处于待处理状态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"
见图片:
答案 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来检查请求。这样可以使您更清楚地了解问题。 我附上了我试图弄清楚时捕获的两张图像。
答案 3 :(得分:1)
如果您控制服务器端,则这可能适用于您的情况: 添加到服务器的响应 headers ['Connection'] ='close' 就我而言,“保持活跃”是问题的原因