以下是我的Javascript语言
getLocationName(latitude, longitude){
var latlng = new google.maps.LatLng(latitude, longitude);
var geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'location': latlng }, (results, status) => {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {
return results[1].formatted_address; //prints value here but not outside the geocoder function
}
}
});
}
location_name = this.getLocationName(lat, lng);
我获取的location_name未定义。我可以知道如何访问该地址吗?
答案 0 :(得分:0)
geocoder.geocode
采用回调函数,执行异步操作,然后在得到结果后调用回调函数。
这意味着getLocationName
在调用回调之前返回,并且由于没有return语句,因此它返回undefined
。
return results[1].formatted_address;
从回调返回formatted_address
,而不是从getLocationName
返回!
(results, status) => {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {
return results[1].formatted_address; //This returns from this callback
}
}
}
(通常是邪恶的)setTimeout
会伪造异步请求来证明这一点:
function callMe(value) {
setTimeout(function() { return value; }, 3000);
return "This is not the value";
}
var result = callMe("This is the value");
console.log(result);
https://jsfiddle.net/cok3h4tn/1/
您可以看到正在打印“这不是值”,因为返回的是return "This is not the value";
,而不是return value;
。
这里是google maps sample for geocoding,您可以看到它如何在回调中使用结果,而不是尝试返回结果。
或者,这是如何使用回调的另一个示例: 以该示例代码为起点。 它不起作用,但这是一个起点。
function callMe(value) {
setTimeout(function() { return value; }, 3000);
return "This is not the value";
}
var result = callMe("This is the value");
console.log(result);
callMe
被调用,那么我们要获取结果并对其进行处理。
我们可以用另一种方式写,我们要对结果执行的“操作”在它自己的函数handleResult
中。
function handleResult(result) {
console.log(result);
}
function callMe(value) {
setTimeout(function() { return value; }, 3000);
return "This is not the value";
}
var result = callMe("This is the value");
handleResult(result);
现在,这仍然是不正确的,因为“错误”结果仍会传递给handleResult
。
因此,我们需要进行更改,将“正确”的结果传递给handleResult
。
function handleResult(result) {
console.log(result);
}
function callMe(value) {
setTimeout(function() { handleResult(value); }, 3000);
return "This is not the value";
}
callMe("This is the value");
更新的jsfiddle:https://jsfiddle.net/cok3h4tn/4/