Od pewnego czasu walczę z tym. Jestem nowicjuszem w JavaScript i miałem wrażenie, że napisany przeze mnie kod działa asynchronicznie. Oto ogólny przykład:JavaScript nie wydaje się czekać na wartości zwracane
Uruchomiłem kod w funkcji a. Funkcja A następnie wywołuje funkcję B, która musi zwrócić zmienną do A, aby A mógł jej użyć w późniejszych operacjach. Wydaje się jednak, że gdy A dzwoni B, nadal kontynuuje swój własny kod, nie czekając zablokowany na swoją wartość zwracaną, a B nie jest wystarczająco szybki, aby A skończył osiągając punkt, w którym musiałby użyć zwrotu wartość i otrzymuję błąd niezdefiniowanego typu zmiennej .
Sposób, w jaki pracowałem nad tym, to funkcja A, która wywołuje funkcję B, która następnie wywołuje funkcję C, która wykona to, co będą później wykonywać operacje A z wartością zwracaną .... Jestem serializacją mój kod poprzez zaproszenia zamiast zwrotów ... to jest kłopotliwe, choć ...
Oto przykład, gdy 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 jest wywoływana przez onload ciała = "initialize()" w moim html.
Problem polega na tym, że makeMap wymaga wartości długości i długości geograficznej uzyskanej przez funkcję Geocode, ale pojawia się błąd w konsoli, informujący, że wyniki są niezdefiniowane. Co się dzieje? Pochodzę z Javy, więc jestem trochę zdezorientowany tym, jak przepływ danych dzieje się tutaj w JS! To będzie cenna lekcja na przyszłość!
Na pytanie boczne: Jak podzielić funkcje na skrypty zewnętrzne? Co uważa się za dobrą praktykę? czy wszystkie moje funkcje powinny zostać wepchnięte do jednego zewnętrznego pliku .js, czy powinienem pogrupować podobne funkcje?
Dobra, dziękuję, jestem nowy tutaj! –