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

IT技术 javascript google-maps asynchronous
2021-01-26 06:36:14

我正在使用谷歌地图 API,每当我将变量从 codeLatLng 函数返回到 initialize 函数时,它都声称未定义。如果我从 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);
        }
      });
    }
  }

打印出未定义

如果我做:

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

打印出纽约,NY 10012,美国

5个回答

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

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);
      }
    });
  }
}
这是最好的方法,因为不必在全局变量中公开地理编码器结果。
2021-03-14 06:36:14
是的,这样就好了。实际上我有一组经纬度值。我想迭代地处理数组并继续将地址添加到列表中。顺便说一句,有没有办法一次对一组经纬度值进行反向地理编码?以及如何将 addr 分配给全局变量?我可以在函数内做 x=addr 吗?
2021-03-18 06:36:14
@AbtPst:不知道有没有处理多个坐标的方法,得查阅文档。否则,您将链接调用,即在一个结果到达时进行另一个调用。要收集结果,您可能需要使用全局数组,例如var addresses = [];,然后使用addresses.push(addr);来添加结果。其他进行多次调用的行为受到服务器的限制,即在短时间内调用一定数量后返回错误。所以当你得到它时,你需要等待一段时间才能再次尝试。
2021-03-18 06:36:14
是否可以返回 addr 的值?我应该如何将 addr 分配给变量?
2021-03-24 06:36:14
@AbtPst:在异步调用中不能从结果中返回任何内容,因为调用在有结果之前返回。我放置的地方alert(addr);是您可以使用结果的地方。可以将值分配给全局变量,但是您仍然必须等待值到达。
2021-04-09 06:36:14

您正在发出异步请求,您的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);
}

您可以使用 localstorage 获取value。

 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");

但它返回以前的值.. 当我们单击两次时返回当前值...

将 geocoder 作为参数传递给 codeLatLng() 函数。

function codeLatLng(geocoder) {

在初始化函数中像这样调用它:

var addr = codeLatLng(geocoder);

那个回报不是从codeLatLng; 它从传递给的匿名函数返回geocoder.geocode

我认为您需要使用另一种机制(例如全局变量)传递数据