0

ランダムキーを生成する関数を含む key_gen.php ファイルがあります。実行すると、php ファイルは 1 つのキーを返します (テスト済みで動作します)。

私のjavascriptファイルには、ボタンにクリックイベントがあります(動作します)。次のようなものです:

$('#kg_btn').click(function(){});

次に、クリックイベント内に関数があります:

         var get_key = function(){
            for(var i = 0; i < kg_quantity; i++) {
                $.ajax ({
                    url: "../keygen/gen_rkey.php",
                    type: "GET",
                    datatype: "json",
                    success: function(data) {
                        var j_obj = JSON.parse(data);
                        //alert("Success!");
                        prs = j_obj.test;
                        console.log(prs);
                        //add_key();

                    },
                    error: function(error) {
                        alert("Error! Can't send the data");
                    }
                }); //ajax call ends 

            }
        }

この関数を 1 回実行すると (「Kg_quantity」変数を 1 に設定して)、ボタンをクリックするたびに正しい動作が得られます。その結果、クリックごとに console.log のキーが異なります。

「kg_quantity」を 1 以外の数値 (例: 3、9、10) に設定すると、console.log メッセージが返されますが、生成される数値は同じです。

ajax オブジェクトを for ループに挿入すると、ajax 呼び出しが数回実行されることを期待していました。プロトタイプ関数内にも ajax 呼び出しを入れようとしましたが、同じ結果が得られます。

編集:(Rossが示唆したように)クロージャーを追加しようとしましたが、まったく同じ結果が得られました。

ありがとう。

4

1 に答える 1

3

AJAX は非同期です。おそらく、最初の AJAX 応答の前にループが終了します。

AJAX 呼び出しからの成功応答が次の反復をトリガーするように、それを再構築します。または、怠惰な場合は、async:false を設定できます。

$.ajax ({
    url: "../keygen/gen_rkey.php",
    type: "GET",
    async: false,
    ....

または、サーバーに負荷をかけ、前後のやり取りを減らして、すべてのキーを 1 回の応答で取得することもできます。

url: "../keygen/gen_rkey.php?qty=" + kg_quantity,

更新: 非同期設計方法:

function getKeys(max,cur) {
    cur = cur || 1;
    if (cur == max) {
        return;
    }
    $.ajax({
        ....
        success(function(data) {
             // do stuff....

            // recursive iteration
            getKeys(max,cur + 1);
        }
    });
}
getKeys(5);
于 2013-08-09T17:18:12.567 に答える