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