Кажется, JavaScript не ждет возвращаемых значений
Я боролся с этим некоторое время сейчас. Я новичок в Javascript, и у меня сложилось впечатление, что код, который я пишу, работает асинхронно. Вот общий пример:
Я запускаю некоторый код в функции а. Затем функция A вызывает функцию B, которой необходимо вернуть переменную в A, чтобы A могла использовать ее в своих последующих операциях. Кажется, однако, что, когда A вызывает B, он все еще продолжает запускать свой собственный код, не ожидая заблокированного возвращаемого значения, и B недостаточно быстр, чтобы A в конечном итоге достигло точки, в которой он должен был бы использовать возврат значение и я получаюнеопределенная ошибка типа переменной.
Чтобы обойти это, я должен вызвать функцию A, вызывая функцию B, которая затем вызывает функцию C, которая будет делать то же, что и более поздние операции, которые A будет выполнять с возвращаемым значением ... вместо возврата ... это громоздко, хотя ...
Вот пример того, когда это происходит в реальном коде:
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);
}
Примечание: initialize вызывается телом onload = "initialize ()" в моем html.
Итак, проблема в том, что makeMap требует значения широты и долготы, полученные функцией Geocode, но я получаю сообщение об ошибке в консоли, в котором говорится, что результаты не определены. Что происходит? Я пришел с Java, так что я немного озадачен тем, как происходит поток данных здесь, в JS! Это будут ценные уроки на будущее!
По боковому вопросу: Как мне разделить мои функции по внешним скриптам? Что считается хорошей практикой? Должны ли все мои функции быть объединены в один внешний файл .js или я должен сгруппировать подобные функции вместе?