He una pieza de código jQuery que invoca varios getJSON()
llamadas en rápida sucesión:condición de alcance o la carrera de jQuery en AJAX/getJSON
var table = $("table#output");
for (var i in items) {
var thisItem = items[i];
$.getJSON("myService", { "itemID": thisItem }, function(json) {
var str = "<tr>";
str += "<td>" + thisItem + "</td>";
str += "<td>" + json.someMember + "</td>";
str += "</tr>";
table.append(str);
});
}
Cuando ejecuto esto en contra de un servidor lag, la tabla se rellena con el valores json.someMember
esperados (llegan fuera de servicio: no me importa), pero la columna thisItem
está poblada con una mezcla impredecible de valores de varias iteraciones.
Supongo que esto tiene algo que ver con el alcance y el tiempo: ¿la función de devolución de llamada está leyendo thisItem
desde un alcance más amplio? ¿Estoy en lo cierto? ¿Cómo evito esto?
Mi solución actual es que el servicio JSON devuelva una copia de sus entradas, lo que es insatisfactorio por decir lo menos.
Gracias Slim por hacer esta pregunta. También tuve algunos problemas (era consciente de que la función asincrónica regresa pero no estoy seguro de cómo señalar a la llamada getJSON qué ubicación colocará un valor de retorno). –