0

我有一个 key_gen.php 文件,其中包含一个生成随机密钥的函数。执行时,php 文件会返回一个密钥(经过测试并且可以工作)。

在我的 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 

            }
        }

当我运行此函数一次(通过将“Kg_quantity”变量设置为 1)时,每次单击按钮时都会得到正确的行为。结果是每次单击时 console.log 上的键不同。

如果我将“kg_quantity”设置为 1 以外的任何其他数字(例如:3、9、10),我会返回 console.log 消息,但生成的数字是相同的。

我希望通过将 ajax 对象插入 for 循环来多次执行 ajax 调用。我也尝试将 ajax 调用放在原型函数中,但我得到了相同的结果。

编辑:我尝试添加一个闭包(正如罗斯建议的那样),但我得到了完全相同的结果。

谢谢。

4

1 回答 1

3

AJAX 是异步的。您的循环很可能会在第一个 AJAX 响应之前完成。

我将对其进行重组,以便 AJAX 调用的成功响应将触发下一次迭代。或者如果你很懒,你可以设置 async:false:

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

或者更好的是,将压力放在服务器上并减少来回操作,以便您在一个响应中获得所有密钥:

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 回答