如何在反向地理编码函数中更改var的值[重复]

问题描述 投票:-2回答:2

这个问题在这里已有答案:

我正在尝试获取我的项目的地址信息。如果我在地理编码函数中写入,我可以通过alert()方法查看地址。但如果我在函数之外,则返回undefined。

试图写像window.adres这样的变量名,但没有用。我认为因为另一个功能是父母的这个。

如何使变量全局并改变值?

var geocoder = new google.maps.Geocoder;
var adres;

 var latlng = {lat: parseFloat(lat), lng: parseFloat(lon)};
    geocoder.geocode({'location': latlng}, function(results, status) {
      if (status === 'OK') {
        if (results[0]) {
         adres = results[0].formatted_address;
         //window.adres = ... is not working. i think because of an another function which is parent of these lines.
          alert(adres); //returns address   
        } 
      } else {
        window.alert('Geocoder failed due to: ' + status);
      }

 alert(adres); //returns undefined

我也试过了

var geocoder = new google.maps.Geocoder;


 var latlng = {lat: parseFloat(lat), lng: parseFloat(lon)};
    var adres = geocoder.geocode({'location': latlng}, function(results, status) {
      if (status === 'OK') {
        if (results[0]) {
         return results[0].formatted_address;

        } 
      } else {
        window.alert('Geocoder failed due to: ' + status);
      }

 alert(adres); //returns undefined too
javascript google-maps reverse-geocoding
2个回答
1
投票

如果你设置一个带有窗口点的全局变量,你可以稍后通过调用相同的(完全限定的)变量来获得它。

这是一个证明这一点的例子(运行代码片段以查看它的运行情况)。

function setVarInFunction(){
  window.adres = 'here is some text';
}
console.log(window.adres); // should be undefined
setVarInFunction();
console.log(window.adres); // now there should be something

alert(adres)没有像你期望的那样工作的原因是:

  • 你在开头创建一个变量
  • 您向Google执行异步请求以执行某些操作,并在从Google返回时更新您的变量
  • 您执行警报以显示var值,但您无法保证Google实际上已使用它的数据做出响应(它几乎肯定尚未响应)

你想用这个值做什么?你几乎肯定不想只是alert()吧?无论你想用它做什么,你都应该在成功或失败的情况下从谷歌回来。


0
投票
  1. 您错过了匿名函数的结尾。
  2. 这是与javascript中的回调相关的问题。

Geocoder需要时间来处理您的请求。因此,您在address尚未定义时提醒您。

我已将您的代码更新为新的编码标准并添加了评论:

let geocoder = new google.maps.Geocoder;
let latlng = { lat: parseFloat(lat), lng: parseFloat(lon) };
let address = null;

// 1. The geocoder starts the process to find the address
geocoder.geocode({'location': latlng}, (results, status) => {
    // 3. The geocoder finally located the address, because it takes time.
    if (status === 'OK') {
        if (results[0]) {
            // This updated the variable with the correct result.
            address = results[0].formatted_address;
            // You should call here a new function, in order to do the rest of your work
        }
    } else {
        window.alert('Geocoder failed due to: ' + status);
    }
});

// 2. you output address
alert(address); // This won't work as address is set by the geocoder which is asynchronous

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.