Was*_*fa1 22 ajax jquery google-chrome xmlhttprequest
偶尔,我的应用程序中的Ajax调用(通过JQuery 1.8)长时间处于待处理状态(有时长达17分钟).我用谷歌搜索了所有可能的解决方案都没有用:
你知道如何解决这个问题吗?谢谢.
在下面的示例中,请求处于待处理状态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)
见图:
小智 7
我偶然发现了同样的问题.一旦我禁用:
使用预测服务可以更快地加载页面
进入高级设置 - >隐私 - > 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 : [];
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)
该代码可能需要针对您的应用程序进行一些调整,但希望您能明白这一点。如果您有任何疑问,请告诉我。
归档时间: |
|
查看次数: |
30670 次 |
最近记录: |