jQuery:在$ .post调用中,回调直到最后才被处理

时间:2009-12-24 18:11:57

标签: ajax jquery

我在循环中有一个$ .post函数。所有这一切都调用PHP函数来验证输入。如果输入验证,则返回“true”(我测试并工作)。此时我使用回调来进行一些处理,但它无法正常工作。

例如,如果我循环遍历三个项目,则回调函数会处理第三个项目而不是每个项目。

以下是我的相关代码:

for (step in steps) {
            var step_name = steps[step];
            // grab input value
            var step_answer = escape($("#" + step_name).val());
            if (step_answer != "") {
                // check to see if answer validates
                console.log(step_name) // THIS SHOWS CORRECT VALUES: 1, 2, and 3
                $.post("utility.php", {
                    utility: "validateAnswer",
                    step: step_name,
                    answer: step_answer
                },
                function(data) {
                    // if validation suceeds..
                    if (data == "true") {
                        console.log(step_name); // THIS SHOWS WRONG VALUES: 3, 3, and 3
                        correct_steps.push(step_name);
                    }
                });
            } 
        }

有什么想法吗?感谢。

5 个答案:

答案 0 :(得分:2)

这是javascript关闭方式的问题。基本上,当您在顶层创建变量时(就像您正在做的那样),它实际上只创建了window.step_name,它实际上是一个全局变量,因此该值不会被封装在回调中。

但是,如果在函数内部创建变量,则不会发生这种情况。因此,请尝试将代码包装在函数中,看看它是否有效。

简单方法:

(function() {
    // code here
})();

如果可行,您可能需要考虑将代码放在命名函数中以便以后更容易维护。

或者,您可以使用jquery的$ .each:

$.each(steps, function() {
    var step_name = this;
    // code from inside loop here
}

答案 1 :(得分:0)

由于step_namepost()调用之外的本地参数,因此在异步回调触发之前将其修改为(3)。

您可以尝试将step_name传递回来吗?也许作为json对象的一部分,如下所示。

function(data) {
    // if validation suceeds..
    // data example: { valid: "true", step: 1 }
    if (data.valid == "true") {
        console.log(data.step);
        correct_steps.push(data.step);
    }
});

答案 2 :(得分:0)

这是因为step_namefor循环中声明,for循环在第一个POST请求完成之前到达终点。也就是说,当执行$.post内的函数时,循环已经循环,step_name等于3.这就是异步调用的本质,你可以通过使用{{{ 1}}调用并设置$.ajax

async: false

没有需要这样做,但是,“utility.php”将获得正确的值,无论你如何做。从PHP脚本中注销响应以获得正确的结果会更明智。

答案 3 :(得分:0)

我猜你所看到的是由于在循环中使用闭包。也许试试:

            $.post("utility.php", {
                utility: "validateAnswer",
                step: step_name,
                answer: step_answer
            },
            function(data) {
                // if validation suceeds..
                if (data == "true") {
                    console.log(this.data.step);
                    correct_steps.push(this.data.answer);
                }
            });

在$ .post回调中,this是AJAX请求对象。

答案 4 :(得分:0)

我唯一能想到的是,在你的循环已经完成并且步骤变量增加到3之前,你的ajax调用是不完整的。