1

好的,所以我们有以下代码:

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 查询后显示实时反馈。

有什么解决办法吗?

4

5 回答 5

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:我没有执行该功能,但这个逻辑应该有效。

于 2013-06-03T06:22:08.953 回答
0

要解决上述问题,请尝试在第一个 ajax 成功函数中获取条件,并将第二个 ajax 代码放在成功函数的站点之外。

于 2013-06-03T06:08:12.763 回答
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++
        } 
     })
    }
  }

这样,您的 while 循环将仅在ajax返回某些内容时递增。到那时,它将继续运行i' 的先前值,并且由于execute是 False,ajax 只会命中一次

于 2013-06-03T06:11:44.780 回答
0

你可以使用递归:

function sync(i) {
  if (i < 2) {
    $.ajax({...,
      success: function(options) {
        ...
        $.ajax({...,
          success: function(options) {
            ...
            sync(i+1);
          }
        });
      }
    });
  }
}
sync(0);
于 2013-06-03T06:32:04.183 回答
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;
                  }
              });
          }
      });
    }
}
于 2013-06-03T06:44:30.687 回答