while sentencia for ejemplos ciclo bucle javascript callback

sentencia - Cuando se utilizan devoluciones de llamada dentro de un bucle en JavaScript, ¿hay alguna forma de guardar una variable que se actualiza en el bucle para su uso en la devolución de llamada?



javascript for each (2)

Ok, parecí resolver esto. Lo que tenía que hacer era poner un contenedor de function(var) alrededor de otherVariable.doSomething() , por lo que el código actualizado se ve así:

for(var i = 0; i < length; i++){ var variable = variables[i]; (function(var){ //start wrapper code otherVariable.doSomething(var, function(err){ //callback for when doSomething ends do something else with var; //please note that i''m dealing with var here, not variable } })(variable);//passing in variable to var here }

Espero que esto ayude a cualquier otra persona que se quede atrapada en algo como esto en el futuro.

@ aparker42, aún me encantaría escuchar tu respuesta a mi pregunta en el comentario de tu pregunta, ya que eso todavía me confunde.

EDITAR: por supuesto, como es javascript, no querrás usar var como nombre de variable.

Esta pregunta ya tiene una respuesta aquí:

Digamos que tengo algo de la siguiente manera:

for(var i = 0; i < length; i++){ var variable = variables[i]; otherVariable.doSomething(variable, function(err){ //callback for when doSomething ends do something else with variable; }

Para cuando se llamen las devoluciones de llamada, la variable será inevitablemente la última variable para todas las devoluciones de llamada, en lugar de ser una diferente para cada devolución de llamada, como me gustaría. Me doy cuenta de que podría pasar variable a hacer doSomething() y luego recuperarlo como parte de la devolución de llamada, pero doSomething() es parte de una biblioteca externa, y prefiero no perder el código fuente para eso.

¿Aquellos de ustedes que conocen JavaScript mejor de lo que yo sé si hay alguna forma alternativa de hacer lo que me gustaría hacer?

Mejor, y gracias,
Sami


Una forma común, aunque fea, de tratar con esta situación es usar otra función que se invoca inmediatamente para crear un ámbito para contener la variable.

for(var i = 0; i < length; i++) { var variable = variables[i]; otherVariable.doSomething(function(v) { return function(err) { /* something with v */ }; }(variable)); }

Observe que dentro de la función invocada inmediatamente, la devolución de llamada que se está creando, y que se devuelve, hace referencia al parámetro a la función v y no a la variable externa. Para hacer que esta lectura sea mucho mejor, sugeriría extraer el constructor de la devolución de llamada como una función nombrada.

function callbackFor(v) { return function(err) { /* something with v */ }; } for(var i = 0; i < length; i++) { var variable = variables[i]; otherVariable.doSomething(callbackFor(variable)); }