2010-04-22 26 views
16

Bu js döngü betiği her zaman bir jquery ajax funciton içindeki ui_item'in son değerini alır. Her iterasyonun doğru değerini nasıl yakalayabiliriz?jQuery ajax bir döngü sorunu içinde

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"); 
     } 
    }); 

} 

Teşekkürler!

+0

ui_item önce 'let' ekle bunu çözecektir. – kamushin

cevap

42

Sorun, anonim geri arama yönteminin ui_item değişkenini referans alarak yakalamasıdır. Tek bir değişken olduğundan, her zaman değişkene en son atanan şeyi alır.

for döngüsünün içeriğini i parametresini parametre olarak alan bir işleve sarmanız, ardından döngüdeki işlevi çağırmanız gerekir. Sarıcı işlevine yapılan her çağrı, sorunu çözerek ayrı bir değişken oluşturacaktır. Örneğin

:

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

Düzeltme için teşekkürler, ama küçük bir not eklemek zorunda hissediyorum. Bazen ses internet üzerinden iyi bir şekilde iletilmez ve "* WRONG *" ile başlayan bir yorum yapmak sert görünüyordu. Ama cevabınızı gördüğüme memnun oldum ve düzeltmeyi takdir ettim. +1 benden. – awgy

+3

@awgy: Üzgünüm; Saldırmak istemedim. Ancak, iki yanlış cevap (ve bir> 100K kullanıcısı) görerek, yanlış anlaşılmayı sağlam bir şekilde sürdürmek istedim. (Ve, ben çok yorgunum) – SLaks

+0

harika, çok teşekkür ederim –

-4

açın zaman uyumsuz kapalı, bu sanırım sorunu çözecektir. Bunu eklemek istiyorum: async: false

+3

Evet, tarayıcınızın yavaş yüklenmesine neden olan 'hızlı ve kirli' bir düzeltme, yükleme işlemini tamamen kesintiye uğratabilir. – MadushM

+3

Bir güncelleştirme olarak: async false, jQuery 1.8'den itibaren kullanımdan kaldırılmıştır. http://api.jquery.com/jQuery.ajax/ – fldsofglry

+1

Async devre dışı bırakmak korkunç bir fikir .... – Rob