我试图使用jQuery方法$ .when
进行并行调用<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Sample Title</title>
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"> </script>
<script>
$.when(
// Get the first call
$.ajax("delay_test.php"),
// Get the second call
$.ajax("delay_test.php")
).then(function(first,second) {
$("body").append("Done: "+first[0]+"<br>Done: "+second[0]);
});
</script>
</body>
</html>
我还制作了一个用于测试的PHP代码,看看它是否真的避免在第一个调用完成后进行第二次调用。
<?php
sleep(5);
echo date("H:i:s");
?>
但我收到的是5秒的差异:
Done: 15:27:55
Done: 15:28:00
我做错了什么或误解了吗?
答案 0 :(得分:0)
首先,假设您可以使用cache:false
解决您的AJAX请求来解决您的问题:
$.when(
// Get the first call
$.ajax({url:"delay.php",cache:false}),
// Get the second call
$.ajax({url:"delay.php",cache:false})
).then(function(first,second) {
$("body").append("Done: "+first[0]+"<br>Done: "+second[0]);
});
现在让我说,我不太清楚为什么。有关chrome等待第一个AJAX请求发送第二个结果的事情;或许等着看它是否应该从缓存中提取结果。也许有人对Chrome更开明的人可以说出原因。我在IE 11中没有问题,我没有测试FireFox,Safari,Opera等。
或者,如果您不想使用对象并定义url
和cache
(cache:false
选项,则可以将GET变量附加到URL的末尾URL的时间戳,使其唯一)。类似的东西:
$.when(
// Get the first call
$.ajax("delay.php?r1"),
// Get the second call
$.ajax("delay.php?r2")
).then(function(first,second) {
$("body").append("Done: "+first[0]+"<br>Done: "+second[0]);
});
编辑:另一种方法是在PHP脚本中设置no-cache标头。如果您使用此方法,则可能必须先清除缓存,因为您的浏览器可能已缓存它:
<德尔> header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
德尔>
<删除> header("Cache-Control: post-check=0, pre-check=0", false);
德尔>
<删除> header("Pragma: no-cache");
德尔>
没关系上述建议 - 在我的测试中没有用。