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