2011-03-19 16 views
5

Estoy usando la API de jQuery $.getJSON() para recuperar datos de una URL determinada para un conjunto de utilidades. Realmente me gustaría encontrar una forma de reutilizar el código (todo es exactamente lo mismo) para cada utilidad. Dado que el ciclo se está ejecutando sin respeto a la llamada ajax, no he podido encontrar la forma de retener el valor del ciclo.Asynchronicity dentro de un bucle

Esa descripción chupa, lo sé, por lo here'a un fragmento de código que define un poco mejor:

var utility_types = [ 'Electricity', 'Gas', 'Water' ]; 

/** Retrieve known utility providers for the given zip code */ 
for(var i = 0; i < utility_types.length; i++) { 
    var type = utility_types[i]; 

    $.getJSON('/addresses/utilities/' + zip + '/' + type + '.json', null, function(data, status) { 
    alert('Processing ' + type); 
    }); 
} 

Tengo que encontrar una manera de pasar el valor de tipo en la devolución de llamada para que pueda aplicar la sintaxis correcta Sin eso, los 3 bucles se ejecutan en contra de la utilidad "Agua". Sé por qué es no trabajando, solo me pregunto si hay una solución razonable.

Gracias.

Respuesta

4

Crear un cierre

var utility_types = [ 'Electricity', 'Gas', 'Water' ]; 

function getCallBack(type){ 
    return function(data,status){ 
    alert('Processing ' + type); 
    } 
} 

/** Retrieve known utility providers for the given zip code */ 

for(var i = 0; i < utility_types.length; i++) { 
    var type = utility_types[i]; 

    $.getJSON('/addresses/utilities/' + zip + '/' + type + '.json', null, getCallBack(type)); 
} 
3

La forma canónica de hacer esto sin dejar de utilizar un cierre anónima es la creación de un nuevo cierre anónima que se invoca inmediatamente y pasó la variable de bucle que luego vuelve la devolución de llamada real.

Este cierre anónimo tiene su propio alcance que contiene sus propias variables (incluyendo el parámetro pasado) que puede anular las variables del bucle externo, por ejemplo:

..., success: (function(type) { 
    return function() { 
     alert(type); 
    } 
}(type)) 

El type en los paréntesis, en el exterior es el bucle variable. El type en la declaración de función es un parámetro que está en el alcance del nuevo cierre. Cuando se llama al alert, usa el que está más cerca en el alcance, es decir, el parámetro.

Por supuesto, el parámetro puede tener su propio nombre de variable, ¡no tiene que ser el mismo que el del alcance externo! Si fuera diferente, ambos estarían disponibles, pero la versión externa del alcance siempre tendría el mismo valor.

0

puede asignar el valor 'tipo' a una variable miembro para cada petición Ajax, y probarlo usando la palabra clave this en la función de devolución de llamada de éxito:

var utility_types = [ 'Electricity', 'Gas', 'Water' ]; 

/** Retrieve known utility providers for the given zip code */ 
for(var i = 0; i < utility_types.length; i++) { 
    var type = utility_types[i]; 

    var jsonReq = $.getJSON('/addresses/utilities/' + zip + '/' + type + '.json', null, function(data, status) { 
    alert('Processing ' + this.utilityType); 
    }); 
    jsonReq.utilityType = type; 
} 
Cuestiones relacionadas