Вы увидите, что этот шаблон часто используется в JavaScript для асинхронных операций - второй аргумент geocode()
- это функция обратного вызова, которая вызывается, когда заканчивается потенциально дорогостоящая и долгоживущая операция геокодирования.Если бы вызов был синхронным, он заблокировал бы вашу веб-страницу и любой другой код JavaScript, пока он не вернется.
Небольшой недостаток использования асинхронных функций заключается в том, что они возвращаются немедленно, поэтому вы не можете использовать return
для возврата значения;точно так же, как вы узнали в своем примере геокодирования - вызов geocode()
немедленно возвращается без результата и работает в фоновом режиме, вызывая функцию обратного вызова с фактическим результатом через некоторое время.
Одним из решений будетсамостоятельно указать функцию обратного вызова при вызове getLatLng
:
function getLatLng(geocoder, adr, myCallback){
var latLng = '';
geocoder.geocode({
address: adr
},
function(results, status){
if (status == google.maps.GeocoderStatus.OK && results.length) {
latLng = results[0].geometry.location;
if(myCallback){
myCallback(latlng);
}
}
});
}