Parece que JavaScript no espera los valores de retorno
He estado luchando con esto por un tiempo ahora. Soy nuevo en Javascript y tengo la impresión de que el código que he estado escribiendo se ha ejecutado de forma asíncrona. Aquí hay un ejemplo genérico:
Ejecuto algun codigo en funcion a. La función A luego llama a la función B, que necesita devolver una variable a A para que A pueda usarla en sus operaciones posteriores. Sin embargo, parece que cuando A llama a B, aún continúa ejecutando su propio código, sin esperar el bloqueo de su valor de devolución, y B no es lo suficientemente rápido como para que A termine llegando al punto en el que habría necesitado usar la devolución. Valor y me sale unerror de tipo de variable no definido.
La forma en que he resuelto esto es tener la función A, la función B, que luego llama a la función C que haría las operaciones posteriores que A estaría haciendo con el valor de retorno ... Estoy serializando mi código a través de las llamadas En lugar de devoluciones ... aunque es engorroso ...
Aquí hay un ejemplo de cuándo sucede en el código real:
function initialize() {
//Geocode Address to obtin Lat and Long coordinates for the starting point of our map
geocoder = new google.maps.Geocoder();
var results = geocode(geocoder);
makeMap(results[0].geometry.location.lat(), results[0].geometry.location.lng());
}
function geocode(geocoder) {
//do geocoding here...
var address = "3630 University Street, Montreal, QC, Canada";
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
return results;
}
else {
alert("Geocode was not successful for the following reason: " + status);
}
});
}
function makeMap(lat, long) {
// alert(lat); for debuging
var mapOptions = {
center: new google.maps.LatLng(lat, long),
zoom: 17,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"),
mapOptions);
}
Nota: initialize es llamado por el cuerpo onload = "initialize ()" en mi html.
Entonces, el problema es que makeMap requiere los valores de latitud y longitud obtenidos por la función Geocode, pero recibo un error en la consola que dice que los resultados no están definidos. Que esta pasando? Vengo de Java, así que estoy un poco confundido acerca de cómo está ocurriendo el flujo de datos aquí en JS. ¡Estas serán valiosas lecciones para el futuro!
En una pregunta lateral: ¿Cómo debo dividir mis funciones en scripts externos? ¿Qué se considera buena práctica? ¿Todas mis funciones deben estar agrupadas en un archivo .js externo o debo agrupar funciones semejantes?