php - Ajax 在 for 循环中同时执行所有操作

标签 php javascript jquery ajax for-loop

好的,我们有这样的代码:

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/

相关文章:

javascript - 复选框禁用更改时的一些选择

PHP网站和数据库设计

php - 从 MySQL 表中提取 4 个表行并在页面上用 PHP 显示?

javascript - Angular : Have a link if the index is greater than 0

javascript - 使 SVG Circle 笔划-dashoffset 动画

javascript - 如何将 IRL 变量传递给 JavaScript

JQUERY - 如何在其包含的 div 框从左向右滑动时显示文本?

asp.net - ASP.NET Ajax 库死了吗?

php - 在 Yii 中,为什么使用 CActiveDataProvider 而不是 Post::model()->findAll()?

php - 测试 Doctrine EntityManager 写入失败