我只是碰到了一些奇怪的东西.我有两个JSON数组,它们包含不同的数据.通常我只需要其中一个数据,但是当我尝试进行双ajax调用以从两个数组中获取数据时,我最终得到两个调用的完全相同的数据.
假设数组1保存用户的JSON数据,数组2保存住宅的JSON数据,我想从两个数组中获取数据:( PS!我剪掉了url并type保存了几行.)
$.ajax({
async:false,
data:"type=users&id=3,5,6",
success: function(data) {
data = JSON.parse(data);
alert(data.length) //will alert 3 as expected
}
});
Run Code Online (Sandbox Code Playgroud)
然后我再打电话给那里买些房子:
$.ajax({
async:false,
data:"type=houses&id=2,4",
success: function(data) {
data = JSON.parse(data);
alert(data.length) //alerts 3 as well...
}
});
Run Code Online (Sandbox Code Playgroud)
当我查看params和Firebug的响应时,我可以看到params是正确的,但是响应是错误的.
在我的PHP中,我甚至试图回应一下这样做:
echo $_GET['id'] . ", " . $_GET['type'];
Run Code Online (Sandbox Code Playgroud)
这使得请求在两个调用中看起来完全相同...如果我在ajax调用之间放置一个警报,我得到预期的结果(因为系统等待).但我认为将它们两者同步就足以避免电话崩溃..?
编辑:我已经尝试创建一个在AJAX函数中调用的php文件的副本,并设置调用以转到单独的文件,这使得一切都按预期工作.所以我很确定javascript没什么问题.
更多编辑:如果我从第二个AJAX调用中删除参数,我仍然得到相同的结果.用Firebug查看请求我可以看到params列表是空的,但响应仍然相同......
更多编辑:在Firebug中查看,我可以看到有一个标题名称connection,其值为keep-alive,然后调用标题Keep-Alive值为300.我猜这可能与它有关?在jQuery文档中找不到任何内容,但是......
源代码:我做了一个小测试用例,它重现了这个问题:
PHP
echo $_GET['test'];
die();
Run Code Online (Sandbox Code Playgroud)
HTML
<sript>
$(document).ready(function() {
$.ajax({
type:"get",
url:"bugtest.php",
data="test=hello",
success: function(data) {
$("output").append(data);
}
});
$.ajax({
type:"get",
url:"bugtest.php",
data="test=world!",
success: function(data) {
$("output").append(" "+data);
}
});
});
</script>
<h1>AJAX bug in Aptana's PHP server?</h1>
<output></output>
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的,并且它做同样的事情:hello world!我没有得到我期望的那样,我得到hello hello......
首先,同步AJAX调用在实时系统上基本上是坏的.测试还可以,但不要在家里这样做,孩子们!为什么?因为如果服务器没有在一秒内回答或根本没回答(这很可能),浏览器选项卡将变为无响应.在最糟糕的情况下(旧的Mozillas),整个浏览器将冻结.
</teaching>
缓存不应该是问题,因为当您发送GET请求时,URL是不同的(POST很可能根本不缓存).
您的alert()测试告诉您,它不是PHP的错误,因为它会根据请求发回所有内容
所以我们继续使用JavaScript:
如果您手写代码,我猜,您对请求进行了错误的检查onreadystate(即,对错误的请求对象处理请求的数据检查的函数)
你能告诉我们你使用哪个图书馆?看起来像我的原型.
干杯,
你尝试将时间戳添加到URL?只是为了避免缓存等
data:"type=houses&id=2,4&"+timestamp
Run Code Online (Sandbox Code Playgroud)
更新:
或者只是尝试cache:false使用Ajax
你用 async:false
Async:
Run Code Online (Sandbox Code Playgroud)
默认情况下,所有请求都是异步发送的(默认情况下设置为true).如果需要同步请求,请将此选项设置为false.请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作.
可能是因为这个临时阻止..你可以尝试将其设置为true.