一个for循环内的Ajax一次执行

时间:2013-06-03 06:01:38

标签: 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调用完成 - &gt;第二个Ajax呼叫完成 - &gt;循环 - &gt;第三个Ajax呼叫完成 - &gt;第四次Ajax呼叫完成

基本上是一个接一个。

此外:async:false不是一个选项,因为它会冻结浏览器,我需要在每次Ajax查询后显示实时反馈。

任何解决方案?

5 个答案:

答案 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;
                  }
              });
          }
      });
    }
}