2010-06-07 12 views
26

Estoy trabajando con la API de google maps y cada vez que devuelvo la variable a la función de inicialización de la función codeLatLng, dice indefinido. Si imprimo la variable desde el códigoLatLng, se muestra bien.¿Cómo devuelvo una variable de la devolución de llamada del geocodificador JavaScript de Google Maps?

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    var addr = codeLatLng(); 
    document.write(addr); 

    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       return results[1].formatted_address; 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

imprime indefinidos

si lo hago:

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(); 


    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       document.write(results[1].formatted_address); 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

imprime Nueva York, NY 10012, USA

Respuesta

44

No se puede devolver el valor de la función, el valor no existe aún cuando el la función vuelve.

El método geocode hace una llamada asynchonous y utiliza una devolución de llamada para manejar el resultado, por lo que tiene que hacer lo mismo en la función codeLatLng:

var geocoder; 
function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(function(addr){ 
    alert(addr); 
    }); 
} 

function codeLatLng(callback) { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
    geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     if (results[1]) { 
      callback(results[1].formatted_address); 
     } else { 
      alert("No results found"); 
     } 
     } else { 
     alert("Geocoder failed due to: " + status); 
     } 
    }); 
    } 
} 
+0

es posible devolver el valor de addr? ¿cómo debo asignar el addr a una variable? – AbtPst

+0

@AbtPst: No puede devolver nada del resultado en una llamada asincrónica, ya que la llamada vuelve antes de que haya un resultado. Donde coloqué la 'alerta (addr);' es donde puede usar el resultado.Es posible asignar el valor a una variable global allí, pero aún tendría que esperar a que llegue el valor. – Guffa

+0

sí, estaría bien. en realidad tengo una matriz de valores de latitud larga. Quiero procesar la matriz de forma iterativa y seguir agregando la dirección a una lista. por cierto, ¿hay alguna manera de revertir el geocodificación de una serie de valores lat lon a la vez? y ¿cómo asigno el addr a una variable global? ¿Puedo hacer x = addr dentro de la función? – AbtPst

-2

que el regreso no está regresando de codeLatLng; está volviendo de la función anónima que se pasa al geocoder.geocode.

Creo que tendrá que pasar los datos usando otro mecanismo, p. una variable global

0

pase el geocodificador como parámetro de la función codeLatLng().

function codeLatLng(geocoder) { 

lo llaman como tal en su función de inicialización:

var addr = codeLatLng(geocoder); 
11

Usted está haciendo una solicitud asincrónica, su función codeLatLng() ha terminado y regresado mucho antes de que se realiza el geocodificador.

Si necesita los datos de codificación geográfica para continuar, tendrá a la cadena de sus funciones juntas:

function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    codeLatLng(); 
} 
function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
        if (results[1]) { 
         initContinued(results[1].formatted_address); 
        } else { 
         alert("No results found"); 
        } 
       } else { 
        alert("Geocoder failed due to: " + status); 
       } 
     }); 
     } 

} 
function initContinued(addr) { 
    alert(addr); 
} 
1

La función geocode utiliza una devolución de llamada (function(results, status) { ... }) que es que se llama cuando la función geocode finaliza su trabajo. Por lo tanto, cuando devuelve un valor de esta devolución de llamada, solo lo devuelve a la función geocode, no fuera del codeLatLng.

Con esto usted tiene varias opciones: Definir una variable en codeLatLng y la puso en la función de devolución de llamada, por ejemplo:

function codeLatLng() 
{ 
    var returnValue; 
    geocoder.geocode({'latLng': latlng}, function(results, status) { returnValue = results[1].formatted_address }); 
    return returnValue; 
} 

O hacer las cosas que necesita con el resultado directamente en la función de devolución de llamada. O coloque el resultado en una variable global. (Además, si la función geocode es asíncrona, si vuelve inmediatamente y la devolución de llamada se realiza después, debe hacer una de las dos últimas, no puede devolver el valor de codeLatLng en ese caso)

+1

Su ejemplo de código no funciona. Cuando se devuelve la variable, su valor no se establece, como ocurre más adelante en la función de devolución de llamada. El uso de una variable global funciona para devolver el valor, pero el problema es que el código no recibe ninguna señal cuando el valor está disponible en la variable. El valor no está disponible inmediatamente después de que se llama a la función. – Guffa

+0

Por eso afirmé que si el código geográfico es asíncrono (no sabía si lo era) debería usar los otros dos métodos, la variable global o hacer las cosas en la devolución de llamada. Aunque admito que no señalé que con la variable global no recibiría ninguna señal, por lo que tendría que verificarla periódicamente. –

Cuestiones relacionadas