2010-10-20 14 views
5

Quiero agregar algunos parámetros adicionales a la llamada API de geocodificador de Google, ya que los estoy ejecutando en un bucle, pero no estoy seguro de cómo agregar parámetros de cierre a su función anónima que ya tiene parámetros predeterminados que pasan a la API.Adjuntar parámetros con cierres de javascript a parámetros predeterminados en funciones anónimas

Por ejemplo:

for(var i = 0; i < 5; i++) { 
    geocoder.geocode({'address': address}, function(results, status) { 
     // Geocoder stuff here 
    }); 
} 

Quiero ser capaz de utilizar el valor de i en el pasado geocoder.geocode() función anónima, pero si tuviera un cierre usando }(i)); en la línea 4, por ejemplo, que reemplazaría el primer parámetro que rompería el geocodificador.

¿Hay alguna forma de que pueda usar cierres o pasar el valor de i a la función anónima?

Efectivamente lo que quiero hacer es:

geocoder.geocode({'address': address}, function(results, status, i) { 
    alert(i); // 0, 1, 2, 3, 4 
}(i)); 

pero trabajando :-)

Respuesta

11

Se puede acceder a i directamente de usted función anónima (a través del cierre), pero debe capturarlo para que cada llamada a geocode obtenga su propia copia. Como es habitual en javascript, agregar otra función hará el truco. Cambié el nombre a la variable i exterior para que quede más claro:

for(var iter = 0; iter < 5; iter++) { 
    (function(i) { 
     geocoder.geocode({'address': address}, function(results, status) { 
      // Geocoder stuff here 
      // you can freely access i here 
     }); 
    })(iter); 
} 
+0

¡Una solución aún más simple! Debería haber publicado antes – WheresWardy

+1

Iba a decir que era confuso tener 'i' en el alcance exterior y el alcance interno, pero veo que ya lo solucionaste, así que te dejaré :) – Skilldrick

+0

Sugiero que este el ejemplo es el mejor porque otros (son más simples) no funcionan en mi caso: el i dentro de la función de devolución de llamada del geocodificador es siempre el último en el ciclo. Supongo que depende de la naturaleza asíncrona del navegador. ¡Pero esta respuesta funcionó perfectamente! +1! – Igor

3
function geoOuter(i) { 
    geocoder.geocode({'address': address}, function(results, status) { 
     // Geocoder stuff here 
     // This has access to i in the outer function, which will be bound to 
     // a different value of i for each iteration of the loop 
    }); 
} 

for(var i = 0; i < 5; i++) { 
    geoOuter(i); 
} 

Oughta hacerlo ...

+0

Una respuesta tan simple. Muchas gracias :-) – WheresWardy

Cuestiones relacionadas