我正在尝试创建一个函数来从Google Maps JS API(v3)返回lat / long数组。我可以写出从API检索的数据,但是我无法将数据传递给变量。我想做这样的事情:
var latLong = getLatLong(Address);
我创建的功能在这里:
function getLatLong(loc, callback) {
var geocoder = new google.maps.Geocoder();
var array = new Array();
if (geocoder) {
geocoder.geocode({ 'address': loc }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var latLng = results[0].geometry.location;;
$.each(latLng, function(k, v) {
if (k == 'va' || k == 'wa') {
array.push(v);
}
});
var ret = array;
callback(ret);
} else {
console.log("Geocoding failed: " + status);
}
});
}
}
然后我将函数分配给变量并调用它来给我lat / long。
var geo = getLatLong('Dallas, TX', function(result) {
return result;
});
不幸的是,这会产生“未定义”的结果。我可以在函数中访问结果,我只是无法传递它。如何将函数的结果传递给要访问的变量?
答案 0 :(得分:3)
不幸的是,这会产生'未定义'的结果
你的意思是'geo'变量吗?如果是这样,你就错过了回调点。在getLatLong()调用返回后,您传入的函数将被称为以后。回调是异步函数,您将需要使用回调来执行您选择的操作(例如,更改状态,调整显示等)。
尝试将其更改为
function(result) { alert('callback result: '+result); }
检查它是否被正确调用。如果你正确得到alert()
,那么你可能想要这样做:
var geo = null;
getLatLong('Dallas, TX', function(result) {
// cache state
geo = result;
// do something with it
showResultInSomeSpotOnThePage(result);
});
/* We can't use the "geo" variable contents immediately
* after getLatLong returns; it will be set at some time later.
* But there may be some use for keeping the result around indefinitely,
* we just have to be prepared for "geo" to be null if we check it
* before the callback is called.
*/
答案 1 :(得分:3)
您无法按照自己的方式构建代码。问题是geocoder.geocode()
是异步操作。这就是它需要回调函数的原因。当您致电geocoder.geocode()
时,启动获取地理编码的请求,然后返回,让请求在后台运行。当请求最终完成时,google的api会将您传递的匿名函数作为第二个参数执行到geocode()
。
所以,当你致电getLatLong()
时,事情发生的实际顺序是这样的:
geocoder.geocode()
。 (发起地理编码请求)getLatLong()
已完成并返回undefined。 (这是设置geo
的地方)array
,然后调用callback()
为了更好地可视化正在发生的事情,您可以按如下方式编写代码(这与您编写代码的方式完全相同):
function getLatLong(loc, callback) {
var geocoder = new google.maps.Geocoder();
var array = new Array();
function handleGeocodeResponse(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var latLng = results[0].geometry.location;;
$.each(latLng, function(k, v) {
if (k == 'va' || k == 'wa') {
array.push(v);
}
});
var ret = array;
callback(ret);
}
}
if (geocoder) {
geocoder.geocode({ 'address': loc }, handleGeocodeResponse);
} else {
console.log("Geocoding failed: " + status);
}
// note- no return specified explicitly is the same as
//return undefined;
}
因此,如果您无法返回值,那么您如何使用结果?像这样:
getLatLong('Dallas, TX', function(geo) {
// geo is passed to this function as a parameter
// move all code that requires `geo` into this function.
});
答案 2 :(得分:1)
这里的关键点是getLatLong
不返回值。这就是geo
始终未定义的原因。
要使其工作,您需要修改回调函数。像这样:
getLatLong('Dallas, TX', function(result)
{
var geo = result;
//continue to use geo here as you normally would
});
答案 3 :(得分:0)
geo未定义,因为getLatLong()不返回任何内容(这意味着它返回undefined)。