如何从Google Maps JavaScript地理编码器callback中返回variables?

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

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

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

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

geocode方法进行asynchronous调用并使用callback来处理结果,因此您必须在codeLatLng函数中执行相同的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); } }); } } 

您正在发出一个asynchronous请求,您的codeLatLng()函数已经完成,并在地理编码器完成之前返回。

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

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

geocode函数使用callback( function(results, status) { ... } ),当geocode函数完成其工作时将调用该函数。 所以,当你从这个callback中返回一个值时,它只会将其返回给geocode函数,而不是从codeLatLng

有了这个你有几个select:在codeLatLng定义一个variables,并将其设置在callback函数中,例如:

 function codeLatLng() { var returnValue; geocoder.geocode({'latLng': latlng}, function(results, status) { returnValue = results[1].formatted_address }); return returnValue; } 

或者直接在callback函数中做结果。 或者把结果放在一个全局variables中。 (另外,如果geocode函数是asynchronous的 – 如果它立即返回并且之后调用callback,则需要执行最后两个中的一个,在这种情况下,不能从codeLatLng返回值。

将geocoder作为parameter passing给codeLatLng()函数。

 function codeLatLng(geocoder) { 

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

 var addr = codeLatLng(geocoder); 

该返回不是从codeLatLng返回; 它从传递给geocoder.geocode的匿名函数返回。

我想你需要使用另一种机制来传递数据,例如全局variables