2009-12-24 71 views
1

我在循环中有一个$ .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); 
        } 
       }); 
      } 
     } 

任何想法?谢谢。

回答

2

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

但是,如果您在函数内部创建一个变量,则不会发生这种情况。所以试着将你的代码包装在一个函数中,看看它是否有效。

简单的方法:

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

如果这样的作品,你可能要考虑把你的代码在一个名为功能,方便后期维护。

或者,你可以只使用jQuery的$。每个:

$.each(steps, function() { 
    var step_name = this; 
    // code from inside loop here 
} 
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); 
    } 
}); 
0

这是因为step_namefor环申报,并完成了第一个POST请求之前for循环到达终点。也就是说,执行$.post里面的功能时,在循环遍历并step_name等于3,这是异步调用的本质,你可以纠正,如果你想通过使用$.ajax来电和设置async: false

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 
     $.ajax(
      url: "utility.php", 
      data: { 
       utility: "validateAnswer", 
       step: step_name, 
       answer: step_answer 
      }, 
      async: false, 
      success: function(data) { 
       // if validation suceeds.. 
       if (data == "true") { 
        console.log(step_name); // THIS SHOWS CORRECT VALUES: 1, 2, and 3 
        correct_steps.push(step_name); 
       } 
      }); 
     } 
    } 
} 

有没有需要这样做,虽然,“utility.php”将得到正确的价值观,无论你如何做到这一点。从PHP脚本注销响应以获得正确结果将更为明智。

+0

没有理由他需要做异步调用来实现他想要的。 – 2009-12-24 18:21:26

+0

的确如此,但这仅仅是为了证明他将不得不这样做,以便step_name在此期间不会改变。 – 2009-12-24 18:24:33

+0

我的意思是'同步'。其实,我的意思是,你的回答是完全错误的。它与调用是异步的事实无关。 – 2009-12-24 18:27:09

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请求对象。

0

我能想到的唯一的事情就是你的ajax调用并没有完成,直到你的循环已经完成并且step变量增加到3。