2009-12-24 19 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。