繁体   English   中英

无法在javascript中修改全局变量

[英]unable to modify global variable in javascript

 var address ="<%= params[:search] %>"; var lat; var long; var geocoder = new google.maps.Geocoder(); geocoder.geocode( { 'address': address}, function(results, status) { lat = results[0].geometry.location.lat(); long = results[0].geometry.location.lng(); }); alert(lat); //wanna use lat and long here! 

当在函数外部调用时,浏览器始终会发出“未定义”的警报,而在函数内部调用时,浏览器始终会起作用。

您好Ashutosh Gupta

发生这种情况是因为您的alert()发生在变量赋值之前。 您可以使用Promise解决此问题,例如

var address ="<%= params[:search] %>";
var lat;
var lng;
var geocoder = new google.maps.Geocoder();

new Promise((resolve, reject) => {
geocoder.geocode( { 'address': address}, function(results, status) {
    lat = results[0].geometry.location.lat();
    lng = results[0].geometry.location.lng();
    resolve({lat: lat, lng: lng});
}));
}).then((data) => {
    alert(data);
});

geocoder.geocode函数是异步的,在异步操作完成后,它会在回调函数中接收纬度和经度。 只有这样,才能定义latlong变量。

您的警报在启动异步操作后立即运行,这意味着在触发警报时它仍未完成。 因此, latlong仍未定义。

您不能在回调块之外使用经度和纬度。 将其移动到回调块中,它将起作用:

var address ="<%= params[:search] %>";
var lat;
var long;
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function(results, status) {
    lat = results[0].geometry.location.lat();
    long = results[0].geometry.location.lng();
    // you can use lat and lng inside here! :)
    alert(lat);
});

如果您想更好地理解JavaScript中的异步代码, 阅读此文章: https : //stackoverflow.com/a/14220323/2401947

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM