JavaScript nie oczekuje na wartości zwracane
Od jakiegoś czasu walczę z tym. Jestem nowym użytkownikiem Javascript i miałem wrażenie, że kod, który pisałem, działa asynchronicznie. Oto ogólny przykład:
Używam jakiegoś kodu w funkcji a. Funkcja A następnie wywołuje funkcję B, która musi zwrócić zmienną do A, aby A mogła jej użyć w późniejszych operacjach. Wydaje się jednak, że gdy A wywołuje B, nadal uruchamia swój własny kod, nie czekając zablokowany ze względu na zwracaną wartość, a B nie jest wystarczająco szybki, aby A osiągnął punkt, w którym musiałby użyć zwrotu wartość i dostajęniezdefiniowany błąd typu zmiennej.
Sposób, w jaki pracowałem nad tym, to funkcja A Wywołanie Funkcja B, która następnie wywołuje funkcję C, która zrobiłaby to, co robiłaby późniejsza operacja z wartością zwracaną .... Jestem w pewnym sensie serializując mój kod przez wywołania zamiast zwrotów ... to jest uciążliwe ...
Oto przykład, kiedy zdarza się w rzeczywistym kodzie:
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);
}
Uwaga: initialize zostaje wywołany przez body onload = "initialize ()" w moim html.
Problem polega na tym, że makeMap wymaga wartości lat i longitude uzyskanych przez funkcję Geocode, ale w konsoli mówię, że wyniki są niezdefiniowane. Co się dzieje? Pochodzę z Java, więc jestem trochę zdezorientowany, jak w JS zachodzi przepływ danych! Będzie to cenne lekcje na przyszłość!
Na pytanie poboczne: Jak podzielić swoje funkcje na skrypty zewnętrzne? Co jest uważane za dobrą praktykę? czy wszystkie moje funkcje powinny być wciśnięte w jeden zewnętrzny plik .js lub czy powinienem grupować funkcje razem?