variable sincronas por pasar funciones formulario example enviar ejemplos ejemplo data javascript ajax loops callback closures

sincronas - pasar el índice de la función de devolución de llamada de bucle a ajax(JavaScript)



funciones sincronas javascript (3)

Tengo un bucle for que encierra una llamada ajax y estoy tratando de determinar el mejor método para pasar el índice del bucle for a la función de devolución de llamada. Aquí está mi código:

var arr = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010]; for (var i = 0; i < arr.length; i++) { $.ajaxSetup({ cache:false }) $.getJSON("NatGeo.jsp", { ZipCode: arr[i], Radius: document.getElementById("radius").value, sensor: false }, function(data) { DrawZip(data, arr[i]); } ); }

Actualmente, solo se pasa el último valor de la matriz de arr debido a la llamada ajax asíncrona. ¿Cómo puedo pasar cada iteración de la matriz de arr a la función de devolución de llamada, además de ejecutar la llamada ajax sincrónicamente?


Incluso puede omitir los paréntesis for-loop mencionados por John Resig aquí, creo que de esta manera es más legible

for (var i = 0; i < arr.length; i++) (function(i) { // async processing setTimeout(function(){ console.log(i); }, i * 200); })(i);


No leí las 30 preguntas @Anurag enumeradas, pero encontré la siguiente sintaxis de devolución de llamada que parece funcionar:

(function(year) { return (function(data) {DrawZip(data, year);}); })(arr[i])

Esto reemplaza la function(data) original function(data) . Incidentalmente, los resultados están en orden aleatorio, debido a la respuesta asincrónica


Puede usar un cierre de javascript:

for (var i = 0; i < arr.length; i++) { (function(i) { // do your stuff here })(i); }

O simplemente puedes usar $.each :

var arr = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010]; $.each(arr, function(index, value) { $.ajaxSetup({ cache:false }); $.getJSON("NatGeo.jsp", { ZipCode: value, Radius: document.getElementById("radius").value, sensor: false }, function(data) { DrawZip(data, value); } ); });