2010-04-22 9 views
16

Questo script di loop js ottiene sempre l'ultimo valore di ui_item all'interno di una funzione jquery ajax. Come si può cogliere il valore corretto di ogni iterazione?jQuery ajax all'interno di un problema di loop

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

} 

Grazie!

+0

Aggiungi 'let' prima che ui_item risolva questo problema. – kamushin

risposta

42

Il problema è che il metodo di callback anonimo cattura la variabile ui_item come riferimento. Poiché esiste una sola variabile, ottiene sempre ciò che è stato assegnato per ultimo alla variabile.

È necessario avvolgere il contenuto del ciclo for in una funzione che richiede i come parametro, quindi chiamare la funzione nel ciclo. Ogni chiamata alla funzione wrapper creerà una variabile separata, risolvendo il problema.

Ad esempio:

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

Grazie per la correzione, ma mi sento in dovere di aggiungere una piccola nota. A volte il tono non viene trasmesso bene su Internet, e ottenere un commento laconico che inizia con "* ERRATO *" è sembrato duro. Ma, sono stato contento di vedere la tua risposta e ho apprezzato la correzione. +1 da me. – awgy

+3

@awgy: mi dispiace; Non volevo essere offensivo. Tuttavia, vedendo due risposte identicamente errate (e una da un utente> 100K), volevo decisamente respingere l'equivoco. (E, sono esausto) – SLaks

+0

ottimo, grazie mille –

-4

turno asincrono off, si risolverà il problema credo. Voglio dire aggiungere questo: async: false

+3

Sì, è una correzione "rapida e sporca" che causa il caricamento lento del browser e potrebbe addirittura interrompere il caricamento. – MadushM

+3

Come aggiornamento: async false è deprecato da jQuery 1.8. http://api.jquery.com/jQuery.ajax/ – fldsofglry

+1

Disattivare Async è una pessima idea .... – Rob