无法在javascript中修改全局变量

时间:2019-01-20 13:57:58

标签: javascript ruby-on-rails google-maps google-maps-api-3 geocode

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!

浏览器在函数外部调用时始终警告“未定义”,在函数内部调用时起作用。

2 个答案:

答案 0 :(得分:0)

你好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);
});

答案 1 :(得分:0)

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