$ .ajax在for循环中从php文件中提取

时间:2013-08-09 17:14:19

标签: ajax

我有一个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调用放在原型函数中,但是我得到了相同的结果。

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

感谢。

1 个答案:

答案 0 :(得分: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);