好的,我们有这样的代码:
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 调用完成 -> 第二个 Ajax 调用完成 -> 循环 -> 第三个 Ajax 调用完成 -> 第四个 Ajax 调用完成
基本上是一个接一个。
此外:async: false 不是一个选项,因为它会卡住浏览器,并且我需要在每次 Ajax 查询后显示实时反馈。
有什么解决办法吗?
最佳答案
在函数中执行此操作,并在 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:我没有执行该函数,但这个逻辑应该可以工作。
关于php - Ajax 在 for 循环中同时执行所有操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16890777/