2015-10-17 2 views
-1
function instate(loc) 
{ 
    var a; 
    var geocoder = new google.maps.Geocoder; 
    var infowindow = new google.maps.InfoWindow 
    geocoder.geocode({'location': loc}, function(results, status) { 
     if (status === google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
      map.setZoom(5); 
      var arrAddress = results[0].address_components; 
      $.each(arrAddress, function (i, address_component) { 
       if (address_component.types[0] == "administrative_area_level_1"){ 
       a = address_component.short_name; 
       console.log(a); 
       }  
       //return false; // break the loop 
      });   
      } else { 
      window.alert('No results found'); 
      } 
     } else { 
      window.alert('Geocoder failed due to: ' + status); 
     } 
    }); 
} 

Код выше может распечатать правильное значение «a» в консоли, но когда я положил console.log (a) внизу функции, как показано ниже, он не может напечатать правильное значение и просто распечатать «undefined», почему?Почему я не могу получить геолокацию только вне этой функции

function instate(loc) 
{ 
    var a; 
    var geocoder = new google.maps.Geocoder; 
    var infowindow = new google.maps.InfoWindow 
    geocoder.geocode({'location': loc}, function(results, status) { 
     if (status === google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
      map.setZoom(5); 
      var arrAddress = results[0].address_components; 
      $.each(arrAddress, function (i, address_component) { 
       if (address_component.types[0] == "administrative_area_level_1"){ 
       a = address_component.short_name; 

       }  
       //return false; // break the loop 
      });   
      } else { 
      window.alert('No results found'); 
      } 
     } else { 
      window.alert('Geocoder failed due to: ' + status); 
     } 
    }); 
    console.log(a); 
} 
+1

http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call/14220323#14220323 – Teemu

+0

Ну, спасибо! –

ответ

1

Позвольте мне уточнить, что происходит в вашем коде. Внутри вашей функции instate вы определяете переменную с именем a, а затем вызываете geocode, передавая в качестве второго параметра function. Внутри этой функции вы назначаете значение a. Однако функция не была вызвана только после того, как вы ее определили. Существует различие между определением function и его вызовом. Поскольку function является асинхронным, уверенная ставка, что console.log-значение, назначенное в function, не будет вести себя так, как вы предполагали.

+0

google.maps.event.addListener (маркеры [I], 'dragend', функция (ЭВТ) { \t \t \t positionafter = {лат: parseFloat (evt.latLng.lat()), LNG: parseFloat (ЭВТ. latLng.lng())}; \t \t \t \t замещать (positionafter); \t \t \t \t}); Я называю это в другом месте, как и мой код выше, но эти две версии кодов не ведут себя одинаково .... –

+0

Вы вызываете instate, но внутри instate у вас есть поведение, которое я описал в своем ответе. После того, как вы определили асинхронную функцию, она будет выполнена как обратный вызов. Это означает, что за несколько миллисекунд пройдет до его выполнения. Однако вы пытаетесь увидеть значение a до того, как эти миллисекунды были переданы. Вы можете захотеть console.log (новая дата()) внутри функции и после функции. Вы увидите, что дата вне функции больше даты внутри функции. –

+0

Хорошо, спасибо! –

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