题 如何从Google Maps JavaScript地理编码器回调中返回变量?


我正在使用谷歌地图API,每当我从codeLatLng函数返回变量到初始化函数时,它声称未定义。如果我从codeLatLng打印变量,它显示正常。

  var geocoder;
  function initialize() {
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(40.730885,-73.997383);
    var addr = codeLatLng();
    document.write(addr);

  }

  function codeLatLng() {
    var latlng = new google.maps.LatLng(40.730885,-73.997383);
    if (geocoder) {
      geocoder.geocode({'latLng': latlng}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          if (results[1]) {
                return results[1].formatted_address;
          } else {
            alert("No results found");
          }
        } else {
          alert("Geocoder failed due to: " + status);
        }
      });
    }
  }

打印出undefined

如果我做:

  var geocoder;
  function initialize() {
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(40.730885,-73.997383);
    codeLatLng();


  }

  function codeLatLng() {
    var latlng = new google.maps.LatLng(40.730885,-73.997383);
    if (geocoder) {
      geocoder.geocode({'latLng': latlng}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          if (results[1]) {
                document.write(results[1].formatted_address);
          } else {
            alert("No results found");
          }
        } else {
          alert("Geocoder failed due to: " + status);
        }
      });
    }
  }

打印出纽约,纽约州10012,美国


27
2018-06-07 22:12


起源




答案:


您无法从函数返回值,该函数返回时该值尚不存在。

geocode 方法进行异步调用并使用回调来处理结果,所以你必须在中执行相同的操作 codeLatLng 功能:

var geocoder;
function initialize() {
  geocoder = new google.maps.Geocoder();
  var latlng = new google.maps.LatLng(40.730885,-73.997383);
  codeLatLng(function(addr){
    alert(addr);
  });
}

function codeLatLng(callback) {
  var latlng = new google.maps.LatLng(40.730885,-73.997383);
  if (geocoder) {
    geocoder.geocode({'latLng': latlng}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        if (results[1]) {
          callback(results[1].formatted_address);
        } else {
          alert("No results found");
        }
      } else {
        alert("Geocoder failed due to: " + status);
      }
    });
  }
}

46
2018-06-07 22:23



是否有可能返回addr的值?我应该如何将addr分配给变量? - AbtPst
@AbtPst:您不能在异步调用中返回结果中的任何内容,因为调用在结果出现之前返回。我放在哪里 alert(addr); 是你可以使用结果的地方。可以将值分配给全局变量,但是您仍然需要等待值到达。 - Guffa
是的,那没关系。实际上我有一个lat long值的数组。我想迭代地处理数组并继续将地址添加到列表中。顺便说一下,有没有办法一次性反转地理编码一个lat lon值数组?以及如何将addr分配给全局变量?我可以在函数内部执行x = addr吗? - AbtPst
@AbtPst:我不知道是否有处理多个坐标的方法,你必须查阅文档。否则你会链接呼叫,即在一个结果到达时再拨打一个电话。要收集结果,您可能希望使用全局数组,例如 var addresses = [];,然后使用 addresses.push(addr); 添加结果。进行多次呼叫的其他人遇到了来自服务器的限制,即在短时间内一定数量的呼叫之后它返回错误。因此,当你得到它时,你需要等待一段时间才能再次尝试。 - Guffa
谢谢我会尝试使用全局数组 - AbtPst


你正在做一个异步请求,你的 codeLatLng() 函数已完成并在地理编码器完成之前很久就返回了。

如果您需要继续使用地理编码器数据,则必须将功能链接在一起:

function initialize() {
    geocoder = new google.maps.Geocoder();
    codeLatLng();
}
function codeLatLng() {
    var latlng = new google.maps.LatLng(40.730885,-73.997383);
    if (geocoder) {
        geocoder.geocode({'latLng': latlng}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                    if (results[1]) {
                        initContinued(results[1].formatted_address);
                    } else {
                        alert("No results found");
                    }
                } else {
                    alert("Geocoder failed due to: " + status);
                }
        });
      }

}
function initContinued(addr) {
    alert(addr);
}

11
2018-06-07 22:21





您可以使用localstorage获取价值。

 geocoder.geocode({
            'address': address,             
        }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latitude = results[0].geometry.location.lat();
                var longitude = results[0].geometry.location.lng();
            }                             
           localStorage.setItem("endlat", latitude);
           localStorage.setItem("endlng", longitude);
            });
var end_lat = localStorage.getItem("endlat");
var end_lng = localStorage.getItem("endlng");

但它返回前一个值。当我们点击两次时返回当前值...


1
2017-08-25 04:31





将地理编码器作为参数传递给codeLatLng()函数。

function codeLatLng(geocoder) {

在你的初始化函数中调用它:

var addr = codeLatLng(geocoder);

-1
2018-06-07 22:18





那次回归并没有从 codeLatLng;它从传递给的匿名函数返回 geocoder.geocode

我认为您需要使用其他机制传递数据,例如全局变量


-2
2018-06-07 22:16