【问题标题】:unable to modify global variable in javascript无法在javascript中修改全局变量
【发布时间】:2019-01-20 13:57:58
【问题描述】:
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!
浏览器在函数外调用时总是提示“未定义”,从函数内调用时有效。
【问题讨论】:
标签:
javascript
ruby-on-rails
google-maps
google-maps-api-3
geocode
【解决方案1】:
geocoder.geocode 函数是异步的,它在异步操作完成后在回调函数中接收纬度和经度。只有这样lat 和long 变量才会被定义。
您的警报在开始异步操作后立即运行,这意味着在触发警报时它仍未完成。所以,lat 和 long 仍然是未定义的。
您不能在回调块之外使用纬度和经度。将它移动到回调块中,它就会起作用:
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
【解决方案2】:
你好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);
});