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?

questionAnswers(4)

yourAnswerToTheQuestion