昨晚我正在玩jQuery和异步调用,发现了一个不寻常的问题。我想在循环中运行多个Ajax调用。我写了下面的内容(rand.php只是睡了一秒钟并返回一个随机数)。有点令人惊讶的是它同步执行并需要20秒左右才能完成。
$(document).ready(function () {
$([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]).each(function() {
var number = this;
$.get("rand.php", function(data) {
$('#'+number).html(data);
});
});
});
PHP代码如下,
<?php
sleep(1);
echo rand();
?>
我认为这显然是错误的,因为异步调用应该没有阻塞并几乎并行返回。经过多次游戏(假设它是一个服务器问题)后,我发现在URL上添加任何东西,使它看起来像预期的那样不同。也就是它在3秒左右的时间内返回(一次6个左右)。
$(document).ready(function () {
$([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]).each(function() {
var number = this;
$.get("rand.php?"+number, function(data) {
$('#'+number).html(data);
});
});
});
我不认为jQuery / Javascript Guru可以解释这种行为?这是一些浏览器限制吗?为什么只有当URL与我所期望的那样不同时才会运行?
编辑 - 而不是回复,这是使用Chrome(无论是最新的)和Firefox 5/6。我确实在IE中尝试了它,它确实缓存了它,所以忽略了它并专注于Chrome。有趣的是第一个在第一页加载时在IE9中按预期工作,但是在重新加载时只显示缓存的结果。
答案 0 :(得分:0)
你在,不是你。坏!坏IE用户! IE缓存获取请求就好像它是任何其他内容一样。 Jquery有一个内置函数来解决这个问题:
$.ajaxSetup({ cache : false });
这将添加一个漂亮的扰流板来处理这个问题。但为什么要在其他浏览器中添加剧透?通常我这样做:
if(!+"\v1"){
$.ajaxSetup({ cache : false });
}
IE的测试是哪种,只在该浏览器中设置。