我在循环中有一个$ .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);
}
});
}
}
有什么想法吗?感谢。
答案 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_name
是post()
调用之外的本地参数,因此在异步回调触发之前将其修改为(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_name
在for
循环中声明,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调用是不完整的。