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 呼び出しの完了 -> 2 番目の Ajax 呼び出しの完了 -> ループ -> 3 番目の Ajax 呼び出しの完了 -> 4 番目の 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

To fixed the above issue try to get condition in first ajax success function and put the second ajax code out site the success function.

于 2013-06-03T06:08:12.763 に答える
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 に答える
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

ループの代わりに、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 は 1 回しかヒットしません。

于 2013-06-03T06:11:44.780 に答える