我只是遇到了一些奇怪的事情。我有两个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
}
});
然后我再打电话给那里买些房子:
$.ajax({
async:false,
data:"type=houses&id=2,4",
success: function(data) {
data = JSON.parse(data);
alert(data.length) //alerts 3 as well...
}
});
当我查看params并使用Firebug进行响应时,我可以看到params是正确的,但响应是错误的。
在我的PHP中,我甚至试图回应一下这样做:
echo $_GET['id'] . ", " . $_GET['type'];
这使得请求在两个调用中看起来完全相同...如果我在ajax调用之间放置一个警报,我得到预期的结果(因为系统等待)。但是我认为将它们放在同步状态就足以不会使调用崩溃..?
编辑:我已经尝试创建一个在AJAX函数中调用的php文件的副本,并设置调用以转到单独的文件,这使得一切都按预期工作。所以我很确定javascript没什么问题。
更多编辑:如果我从第二次AJAX调用中删除参数,我仍然会得到相同的结果。用Firebug查看请求我可以看到params列表是空的,但响应仍然相同......
更多编辑:在Firebug中查看,我可以看到有一个名为connection
的标头,其值为keep-alive
,然后是一个名为{{的标头1}},其值为Keep-Alive
。我猜这可能与它有关?在jQuery文档中找不到任何内容,但是......
源代码:我做了一个小测试用例,它重现了这个问题:
PHP
300
HTML
echo $_GET['test'];
die();
这就是我所拥有的,并且它做了同样的事情:我得到<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>
......而不是像我期望的那样获得hello world!
...
答案 0 :(得分:6)
首先,同步AJAX调用在实时系统上基本上是不好的。测试还可以,但不要在家里这样做,孩子们!为什么?因为如果服务器没有在一秒内回答或根本没回答(这很可能),浏览器选项卡将变为无响应。在最糟糕的情况下(旧的Mozillas),整个浏览器都会冻结。
</teaching>
缓存不应该是问题,因为当您发送GET请求时,URL是不同的(POST很可能根本不缓存)。
您的alert()
测试告诉您,这不是PHP的错,因为它会按要求发回所有内容
所以我们继续使用JavaScript:
如果您手写代码,我猜,您对请求的onreadystate
执行了错误的检查(即,处理请求的数据检查的函数)错误的请求对象)
您能告诉我们,您使用哪个库?看起来像我的原型。
干杯,
答案 1 :(得分:5)
您是否尝试将时间戳添加到网址?只是为了避免缓存等
data:"type=houses&id=2,4&"+timestamp
更新:
或者只是在Ajax中尝试cache:false
您使用async:false
Async:
默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。
可能是因为这个临时阻止..你可以尝试将其设置为true。
答案 2 :(得分:2)
尝试使用POST。
此外,如果PHP实际上不应该收到2个相同的请求,那么这不是PHP的错;该错误位于您进行$ .ajax调用的位置和Web服务器将请求传递给PHP的位置之间。
您能否提供有关网络服务器的更多信息?你用哪一个?你有什么捕获或优化吗?也许你使用一些PHP框架或PHP“bootstrap”来缓存请求?
您也可以尝试进行独立测试。剥离Ajax代码并使用最小的PHP脚本,它只是回应请求。看看你是否得到了同样的错误。
发送的请求和在php中收到的请求的一些复制粘贴数据会很好。
我从来没有见过这样的东西,我几乎可以肯定它是相关的。作为一种解决方法,您可以将两个请求合并为一个,您将不得不稍微更改PHP脚本。它实际上可能是一个更好的解决方案,因为您应该尽可能少地向服务器发出请求。
答案 3 :(得分:2)
为了确定PHP或JS是否存在问题,您可以使用Charles来监控您的请求(我相信查尔斯不仅仅是萤火虫,不知道为什么)并生成一个独特的值服务器
<?php echo uniqid();
如果两个请求都返回相同的值,那么您的服务器就会出现问题,否则就是浏览器或jscode。
答案 4 :(得分:0)
尝试将第二个请求置于等待0秒的超时中。
$.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
}
});
setTimeout(function(){$.ajax({
async:false,
data:"type=houses&id=2,4",
success: function(data) {
data = JSON.parse(data);
alert(data.length) //alerts 3 as well...
}
})}, 0);
答案 5 :(得分:0)
是否有可能,数据变量存在问题?
如果您将第二个请求更改为:
,会发生什么$.ajax({
async:false,
data:"type=houses&id=2,4",
success: function(dataHouse) {
data = JSON.parse(dataHouse);
alert(dataHouse.length)
}
});
答案 6 :(得分:0)
将下一个ajax调用放在第一个ajax调用的响应中:
function nextAjaxCall(){
$.ajax({
async:false,
data:"type=houses&id=2,4",
success: function(data) {
data = JSON.parse(data);
alert(data.length) //alerts 3 as well...
}
});
}
$.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
nextAjaxCall();
}
error: function(){
//error handling
nextAjaxCall();
}
});
确保即使第一个ajax没有成功返回,也要调用第二个ajax。
答案 7 :(得分:0)
尝试在jQuery ajax()选项中设置global:false。
如果这没有帮助,请尝试调用两个不同的PHP页面 - 一个用于房屋,一个用于用户。如果可行的话,它至少应该有助于缩小问题范围。