好的,我们有这个代码:
var players = '<?php echo $players ?>';
for (var i = 0; i < 2; i++)
{
$.ajax({
type: "POST",
url: "url...",
data: { currentplayer: i, players: players },
dataType: 'json',
cache: false,
timeout:60000,
success: function(output){
<?php echo write_log("output[\"message\"]", "output[\"class\"]") ?>
$.ajax({
type: "POST",
url: "url...",
data: { currentplayer: i, players: players },
dataType: 'json',
cache: false,
timeout:60000,
success: function(output){
<?php echo write_log("output[\"message\"]", "output[\"class\"]") ?>
}
});
}
});
}
现在问题可能听起来很简单但我无法找到解决方案。
显然,第一个成功函数中的Ajax调用秒发生在第一个成功之后。这真的很快,因为它只是一个MySQL请求。
现在,第一个秒更长,因为它是PHP文件中的循环(foreach和while)。现在它触发第一个请求,然后是秒,然后它再次执行相同的操作(循环1次指定)。现在它不会等待请求完成继续循环。
问题:我不希望请求同时出现。
我想这样:
循环开始:第一个Ajax调用完成 - &gt;第二个Ajax呼叫完成 - &gt;循环 - &gt;第三个Ajax呼叫完成 - &gt;第四次Ajax呼叫完成
基本上是一个接一个。
此外:async:false不是一个选项,因为它会冻结浏览器,我需要在每次Ajax查询后显示实时反馈。
任何解决方案?
答案 0 :(得分:1)
在函数中执行此操作,并在2 ajax调用成功时再次调用该函数。同时为当前玩家计数设置一个全局变量,现在在循环中。
var players = '<?php echo $players ?>';
var global_current_player = 0;
function doAjax(current_player) {
$.ajax({
type: "POST",
url: "url...",
data: { currentplayer: current_player, players: players },
dataType: 'json',
cache: false,
timeout:60000,
success: function(output){
$.ajax({
type: "POST",
url: "url...",
data: { currentplayer: current_player, players: players },
dataType: 'json',
cache: false,
timeout:60000,
success: function(output){
global_current_player++;
if (global_current_player < 2) {
doAjax(global_current_player);
}
}
});
}
});
}
doAjax(global_current_player);
所以这个函数是递归的,只能在条件global_current_player < 2
PS:我没有执行该功能,但这个逻辑应该可以工作。
答案 1 :(得分:0)
为了解决上述问题,尝试在第一个ajax成功函数中获取条件,并将第二个ajax代码放在网站成功函数中。
答案 2 :(得分:0)
而不是for
循环,您可以使用while
循环并仅在ajax调用返回成功(或错误)时递增它
尝试:
var i =0;
execute = True
while(i<2){
if(execute){
execute = False
$.ajax({
.. your ajax code ...
success:function(){
execute = True
i++
}
error:function(){
execute = True
i++
}
})
}
}
这样,只有当ajax
返回某些内容时,你的while循环才会递增。在那之前,它会继续运行i
之前的值,并且由于execute
为False,ajax只会命中一次
答案 3 :(得分:0)
你可以使用递归:
function sync(i) {
if (i < 2) {
$.ajax({...,
success: function(options) {
...
$.ajax({...,
success: function(options) {
...
sync(i+1);
}
});
}
});
}
}
sync(0);
答案 4 :(得分:0)
试试这个。我使用True或False标志'prevAjaxCmpltd'来控制AJAX请求的执行。
var players = '<?php echo $players ?>';
var i =0;
var prevAjaxCmpltd = True;
while (i < 2)
{
if(prevAjaxCmpltd){
i++;
prevAjaxCmpltd = False;
$.ajax({
type: "POST",
url: "url...",
data: { currentplayer: i, players: players },
dataType: 'json',
cache: false,
timeout:60000,
success: function(output){
$.ajax({
type: "POST",
url: "url...",
data: { currentplayer: i, players: players },
dataType: 'json',
cache: false,
timeout:60000,
success: function(output){
prevAjaxCmpltd = True;
}
});
}
});
}
}