【问题标题】: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 函数是异步的,它在异步操作完成后在回调函数中接收纬度和经度。只有这样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

    【讨论】:

    • 非常感谢!我将整个代码移到了括号内。
    【解决方案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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多