【发布时间】:2012-01-24 22:17:39
【问题描述】:
这是我的 AJAX 函数:
/**
* Send an AJAX request
*
* @param url The URL to call (located in the /ajax/ directory)
* @param data The data to send (will be serialised with JSON)
* @param callback The function to call with the response text
* @param silent If true, doesn't show errors to the user
* @param loader The element containing "Loading... Please wait"
*/
AJAX = function(url,data,callback,silent,loader) {
var a,
attempt = 0,
rsc = function() {
if( a.readyState == 4) {
if( a.status != 200) {
if( a.status > 999) { // IE sometimes throws 12152
attempt++;
if( attempt < 5)
send();
else if( !silent) {
alert("HTTP Error "+a.status+" "+a.statusText+"<br />Failed to access "+url);
}
}
else if(!silent) {
alert("HTTP Error "+a.status+" "+a.statusText+"\nFailed to access "+url);
}
}
else {
callback(JSON.parse(a.responseText));
}
}
},
to = function() {
a.abort();
attempt++;
if( attempt < 5)
send();
else if( !silent) {
alert("Request Timeout\nFailed to access "+url);
}
};
data = JSON.stringify(data);
var send = function() {
if( loader && attempt != 0) {
loader.children[0].firstChild.nodeValue = "Error... retrying...";
loader.children[1].firstChild.nodeValue = "Attempt "+(attempt+1)+" of 5";
}
a = new XMLHttpRequest();
a.open("POST","/ajax/"+url,true);
a.onreadystatechange = rsc;
a.timeout = 5000;
a.ontimeout = to;
a.setRequestHeader("Content-Type","application/json");
a.send(data);
};
send();
};
一般的想法是最多尝试请求五次。有时 IE 会因异常的 HTTP 错误 (12xxx) 而失败,有时服务器可能无法响应。
我遇到的问题是abort() 调用似乎没有中止连接。为了测试,我做了一个简单的 PHP 脚本:
<?php
sleep(60);
touch("test/".uniqid());
die("Request completed.");
?>
touch() 调用使用当前的uniqid() 创建一个文件 - 通过查看修改时间,我可以看到 sleep(60) 结束的时间。
预期行为:
请求已发送
五秒钟后,文本变为“错误...重新尝试...尝试 2/5”
重复上述操作直到尝试 5/5,然后失败。
对 PHP 文件的五次调用被中止,要么在“test”文件夹中有五个文件,间隔 5 秒,要么没有,因为 ignore_user_abort 已关闭。
观察到的行为(在 IE9 中):
请求已发送
尝试文本出现并按原样更改
尝试五次后,显示错误消息
我整整五分钟都无法加载任何页面。
在服务器上,间隔一分钟有五个文件
我不知道该怎么做,因为在服务器端请求 3、4 和 5 是在浏览器上显示“超时”错误消息几分钟后发送的。
如果有任何区别,则进行 AJAX 调用的页面位于 iframe 中。重新加载 iframe(使用 iframe.contentWindow.location.reload() 并不能解决问题,它仍会等待这五个请求通过。
为什么会这样?我该如何解决?
编辑:我已经使用开发者工具再次运行测试来监控网络活动。结果是:
URL Method Result Type Received Taken Initiator
/ajax/testto (Aborted) 0 B < 1 ms (Pending...)
/ajax/testto (Aborted) 0 B 125 ms (Pending...)
/ajax/testto (Aborted) 0 B 125 ms (Pending...)
/ajax/testto (Aborted) 0 B 125 ms (Pending...)
/ajax/testto (Aborted) 0 B 124 ms (Pending...)
【问题讨论】:
标签: javascript ajax iframe connection-timeout