javascript - mostrar - Accediendo a la matriz desde fuera del bucle de geocodificación
mostrar el contenido de un array javascript (2)
Cuando su función codeAddress
regrese, geocoder.geocode
todavía está haciendo su trabajo, que es asíncrono . Cuando se realiza geocoder.geocode
, invocará su devolución de llamada, que está pasando como una función anónima.
La solución que sugiero es hacer que la función de devolución de llamada sea un parámetro de codeAddress
, y haga lo que necesite de esa devolución de llamada (o de otra función llamada dentro de la devolución de llamada), en lugar de utilizar el enfoque de variables globales.
Logré geocodificar hasta 10 direcciones y agregar un marcador al mapa, pero necesito acceder a los resultados de geocodificación fuera de la función de geocodificación (codeAddress). Pensé que podría enviar los resultados a una matriz variable global (userLat, userLng). Usando alertas, puedo ver que el bucle efectivamente agrega los resultados a la matriz dentro de la función, pero la matriz no tiene valor fuera de la función.
En una nota lateral, la alerta de geocodificación no exitosa debe devolver la Dirección ''i'' dependiendo de la dirección que tenga el problema, pero solo muestra el último valor de dirección del ciclo.
Tal vez los problemas están relacionados? Creo que puede tener algo que ver con mi falta de comprensión de la función anidada.
Espero que esto esté claro. ¡Gracias de antemano por cualquier ayuda!
function codeAddress() {
var useradd = [];
var geocoder = new google.maps.Geocoder();
var howmany = parseFloat(document.getElementById("howmany").value);
for (var i=0; i<howmany; i++) {
useradd[i] = document.getElementById(''address[''+i+'']'').value;
geocoder.geocode( {address: useradd[i]}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
userLat.push(parseFloat(results[0].geometry.location.lat()));
userLng.push(parseFloat(results[0].geometry.location.lng()));
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
}
else {
alert(''Address '' + i + '' was not successfully located for the following reason: '' + status);
}
});
};
}
Editar:
No estoy seguro de haber entendido correctamente, pero he extraído la función de devolución de llamada y he creado una nueva función que es llamada por el geocodificador. El problema sigue siendo el mismo y las variables userLat y userLng no se llevan fuera del bucle. ¿Alguna sugerencia?
función codeAddress () {
function callBack() {
return function(results, status){
if (status == google.maps.GeocoderStatus.OK) {
userLat.push(parseFloat(results[0].geometry.location.lat()));
userLng.push(parseFloat(results[0].geometry.location.lng()));
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
}
else {
alert(''Address '' + i + '' was not successfully located for the following reason: '' + status);
}
}
}
var userLat = [];
var userLng = [];
var useradd = [];
var geocoder = new google.maps.Geocoder();
var howmany = parseFloat(document.getElementById("howmany").value);
for (var i=0; i<howmany; i++) {
useradd[i] = document.getElementById(''address[''+i+'']'').value;
geocoder.geocode({address: useradd[i]}, callBack());
};
}
Se trata de alcance en Javascript. Si desea acceder a variables fuera de la función, debe declarar y crear variables fuera del alcance de la función y luego actualizarlas.
Las variables declaradas fuera del alcance de la función estarán disponibles en cualquier otro lugar dentro del script.
var def = "bombshell";
function changer(){
def = "changed value";
}
changer();
alert(def);
Véalo aquí - http://jsfiddle.net/daveheward/kWn8b/