这个现象很明显是浏览器的一种优化阿
如果发起的链接已在等待响应的链接池内,就不再进行继续冗余请求
【 在 gggggdxn (龙) 的大作中提到: 】
写了一个网页,会向服务器同时发出若干个异步的XMLHttpRequest
URL中带一个参数t, 服务器会根据t的值,先sleep一会儿,再把处理结果发回浏览器
比如URL='wait.php?t=1', 就要一秒钟以后才能收到回复
如果同时发出三个请求,参数分别为t=1, 2, 3, 就会分别在1, 2, 3秒后收到回复
现在遇到一个奇怪的现象:
仍然同时发出三个请求,参数全都是1,期望在1秒后收到三个回复
可是拿firefox 3.6和chrome 9 测试后发现仍然是分别在1, 2, 3秒后才收到
抓包之后发现:第一种情况,三个请求确实是同时发出的;
对第二种情况,后一个请求要等收到到第一个请求的处理结果之后才会发出去
如果修改javascript脚本,在URL后面添上一个没用的参数
比如这样:
wait.php?t=1&i=0
wait.php?t=1&i=1
wait.php?t=1&i=2
这三个请求就可以同时发出去,然后在一秒钟后收到三个回复了
请高人指点:为什么会这样?如何才能不添加没用的参数也能同时发出多个请求?
这里附上测试用的脚本:
============wait.php:===================
Reqest recieved at <?= date("r") ?>.
<?php
$wait = $_GET["t"];
if($wait!=null) {
sleep((int)$wait);
} else {
$wait = 0;
}
?>
Response sent at <?= date("r") ?>.
Wait time was <?=$wait?> second.
=================testxhr.html:==============
<!DOCTYPE HTML>
<html>
<head>
<title>Test Multiple XMLHttpRequests</title>
<script type="text/javascript">
<!--
var reqs = new Array();
function test() {
var waitTimeArray = document.getElementById("tXHR").value.split(" ");
for (i in waitTimeArray) {
doXHR(waitTimeArray[i], i);
}
}
function doXHR (waitTime, i) {
var url = 'wait.php?t=' + waitTime;
//url = url + '&i=' + i;
var req=new XMLHttpRequest();
req.open("GET", url, true);
req.timeStamp = new Array();
req.timeStamp.push(new Date());
req.onreadystatechange = onServerReply;
req.send(null);
reqs.push(req);
}
function onServerReply() {
r=this;
if (r.readyState<4) {
r.timeStamp.push(new Date());
return;
}
if (r.status!=200) return;
var d = document.createElement("div");
d.innerHTML = r.timeStamp +" Server says:<br/>"+ r.responseText;
//d.innerHTML = r.responseText;
document.body.appendChild(d);
}
//-->
</script>
</head>
<body>
<h1>Test Multiple XMLHttpRequests</h1>
<p>
Wait time of XMLHttpRequests in seconds:
<input type="text" id="tXHR" value="1 2 3 4 5"/>
<button type="button" onclick="javascript:test()">Run Test</button>
</p>
</body>
</html>
--
修改:gggggdxn FROM 137.132.207.*
FROM 219.142.46.*