如何从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