这个问题在这里已有答案:
我正在尝试获取我的项目的地址信息。如果我在地理编码函数中写入,我可以通过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
如果你设置一个带有窗口点的全局变量,你可以稍后通过调用相同的(完全限定的)变量来获得它。
这是一个证明这一点的例子(运行代码片段以查看它的运行情况)。
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)
没有像你期望的那样工作的原因是:
你想用这个值做什么?你几乎肯定不想只是alert()
吧?无论你想用它做什么,你都应该在成功或失败的情况下从谷歌回来。
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
希望这可以帮助。