2010-04-22 24 views
16

Este script js loop siempre obtiene el último valor de ui_item dentro de una función jquery ajax. ¿Cómo se puede capturar el valor correcto de cada iteración?jQuery ajax dentro de un problema de bucle

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

} 

¡Gracias!

+0

Agregar 'let' before ui_item resolverá esto. – kamushin

Respuesta

42

El problema es que el método de devolución de llamada anónimo captura la variable ui_item por referencia. Como solo hay una variable, siempre obtiene lo que se asignó por última vez a la variable.

Debe envolver los contenidos del bucle for en una función que toma i como parámetro, luego llama a la función en el bucle. Cada llamada a la función de envoltura creará una variable separada, resolviendo el problema.

Por ejemplo:

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

Gracias por la corrección, pero me siento obligado a agregar una pequeña nota. A veces, el tono no se transmite bien a través de Internet, y para obtener un comentario breve que comienza con "* INCORRECTO *" parecía áspero. Pero, me alegré de ver su respuesta y aprecié la corrección. +1 de mi parte – awgy

+3

@awgy: Lo siento; No quise ser ofensivo. Sin embargo, al ver dos respuestas idénticamente incorrectas (y una de un usuario> 100K), quería descartar firmemente la idea errónea. (Y estoy agotado) – SLaks

+0

genial, muchas gracias –

-4

Encienda asíncrono apagado, se solucionará el problema, supongo. Me refiero a agregar esto: async: falso

+3

Sí, eso es un arreglo 'rápido y sucio' que causa que el navegador cargue despacio incluso podría interrumpir la carga. – MadushM

+3

Como una actualización: async false está en desuso a partir de jQuery 1.8. http://api.jquery.com/jQuery.ajax/ – fldsofglry

+1

Apagar Async es una idea terrible ... – Rob

Cuestiones relacionadas