2013-07-28 2 views
-2

Я просто не могу найти то, что случилось с этим битом кода:Возвращаемое значение с Google Maps геокодирования

function getLocationName(latitude, longitude) { 
    if (isNaN(parseFloat(latitude)) || isNaN(parseFloat(longitude))) { 
     return false; 
    } 

    var locationName; 
    var geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(latitude, longitude) 

    // Reverse Geocoding using google maps api. 
    geocoder.geocode({ 'latLng': latlng }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       locationName = results[1].formatted_address; 
       alert(locationName); 
      } 
      else { 
       locationName = "Unknown"; 
      } 
     } 
     else { 
      locationName = "Couldn't find location. Error code: " + status; 
     } 
    }); 
    alert(locationName); 
    return locationName; 

} 

Я называю это из обработчика JQuery событий, как это:

$("#id").on("event", function (event, ui) { 
    $("#userLocation").text(getLocationName(latitude, longitude)); 
}); 

Weird что первое предупреждение получает правильное значение «locationName», а второе всегда возвращает «undefined». Я попытался инициализировать переменную со значением, и в этом случае первое предупреждение снова вернуло правильное имя места, а второе вернуло значение инициализации. Это дает мне представление о том, что это может быть проблема с переменной областью, но я просто не могу понять, что.

PS. У меня нет других переменных (локальных/глобальных) с тем же именем.

Обновление: Предупреждение работает отлично (благодаря ответу Lwyrn), но возвращаемое значение по-прежнему не так. Я следил за ответами в связанном вопросе SO, но я не мог «вернуть» правильное значение. Предупреждение работало нормально.

+4

Это не из-за переменного объема, это связано с асинхронным характером кода. http://stackoverflow.com/questions/2993563/how-do-retret-a-variable-from-google-maps-javascript-geocoder-callback?rq=1 – DCoder

+1

Затем вы не внимательно прочитали связанный вопрос , Существует ** нет способа ** вернуть * значение из асинхронного действия, вам нужно использовать обратный вызов. (Хорошо, если вы сами делаете вызов AJAX, вы можете сделать его синхронным, а не асинхронным, но это просто неправильно по множеству причин.) – DCoder

ответ

2

Необходимо перемещать «alert (locationName)»; в обратный вызов geocoder.geocode. Потому что geocoder.geocode выполняет запрос AJAX. Когда вы бросаете предупреждение, имя_параметра varName остается неопределенным (не установлено). Попробуй как этот

function getLocationName(latitude, longitude, callback) { 
    if (isNaN(parseFloat(latitude)) || isNaN(parseFloat(longitude))) { 
     return false; 
    } 

    var locationName; 
    var geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(latitude, longitude) 

    // Reverse Geocoding using google maps api. 
    geocoder.geocode({ 'latLng': latlng }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       locationName = results[1].formatted_address; 
       alert(locationName); 
      } 
      else { 
       locationName = "Unknown"; 
      } 
     } 
     else { 
      locationName = "Couldn't find location. Error code: " + status; 
     } 
     alert(locationName); 
     callback(locationName); 
    }); 
} 

Чтобы получить «вернуться» вы должны создать свой собственный обратный вызов. Попробуйте как этот

$("#id").on("event", function (event, ui) { 
    getLocationName(latitude, longitude, function(result){ 
     $("#userLocation").text(result); 
    }); 
}); 

Что касается предупреждения, возвращение вызывается до Аякса запроса. Таким образом, вы должны использовать обратный вызов для вызова, когда запрос ajax выполнил свою работу!

+0

Привет. Спасибо за Ваш ответ. Такие работы. Предупреждение «предупреждает» правильное значение, но возврат не возвращает правильное значение функции, из которой я вызываю getLocationName(). Есть предположения? –

+0

Я отредактировал ответ! – Lwyrn

+0

Спасибо. Отлично. –

Смежные вопросы