2010-04-22 93 views
16

這js循環腳本總是得到ui_item裏面的一個jQuery ajax函數的最後一個值。如何才能捕獲每次迭代的正確值?jQuery ajax內部循環問題

for (var i = 0; i <= split_files_cb_value_holder.length - 1; i++){ 
    var split_values = split_files_cb_value_holder[i].split(':'); 

    ui_item = split_files_cb_value_holder[i]; 

    $.ajax({ 
     type: "POST", 
     url: "ds/index.php/playlist/check_folder", 
     data: "component_type="+$('#component_type').val()+"&value="+split_values[1], 
     success: function(msg) 
     { 
      console.log(ui_item); //ALWAYS GETS THE LAST VALUE 
     }, 
     error: function() 
     { 
      alert("An error occured while updating. Try again in a while"); 
     } 
    }); 

} 

謝謝!

+0

在ui_item之前添加'let'就可以解決這個問題。 – kamushin 2016-10-25 02:43:00

回答

42

問題是,匿名回調方法通過引用捕獲ui_item變量。由於只有一個變量,它總是得到最後分配給變量的任何東西。

您需要將for循環的內容打包到一個函數中,該函數以i作爲參數,然後在循環中調用該函數。對包裝函數的每次調用都會創建一個單獨的變量來解決問題。

例如:

function doCheck(i) { 
    var split_values = split_files_cb_value_holder[i].split(':'); 

    var ui_item = split_files_cb_value_holder[i]; 

    $.ajax({ 
     type: "POST", 
     url: "ds/index.php/playlist/check_folder", 
     data: "component_type="+$('#component_type').val()+"&value="+split_values[1], 
     success: function(msg) 
     { 
      console.log(ui_item); //Don't always get the last value 
     }, 
     error: function() 
     { 
      alert("An error occured while updating. Try again in a while"); 
     } 
    }); 
} 

for (var i = 0; i < split_files_cb_value_holder.length; i++) 
    doCheck(i); 
+3

感謝您的更正,但我感到不得不添加一個小紙條。有時音調無法通過互聯網傳達,並且以「*錯誤*」開始的簡短評論看起來很苛刻。 但是,我很高興看到您的回答,並讚賞糾正。從我+1。 – awgy 2010-04-22 02:30:10

+3

@awgy:對不起;我不是故意冒犯的。然而,看到兩個相同的錯誤答案(並且來自一個大於10萬用戶的答案),我想牢牢地擺脫這種誤解。 (並且,我已經精疲力盡了) – SLaks 2010-04-22 02:34:28

+0

太好了,非常感謝你 – 2017-04-11 09:48:11

-4

打開異步關閉,這將解決我想這個問題。我的意思是添加這個:async:false

+3

是的,這是一個'快速而骯髒的'修復,導致瀏覽器加載速度減慢甚至可能導致加載中斷。 – MadushM 2012-08-30 14:50:24

+3

作爲更新:async false從jQuery 1.8開始已棄用。 http://api.jquery.com/jQuery.ajax/ – fldsofglry 2013-02-18 17:11:34

+1

關閉異步是一個可怕的想法.... – Rob 2016-05-31 14:11:52