无法从地址解析器访问地址-反向地址解析

时间:2018-07-16 12:40:28

标签: javascript angular google-maps google-maps-api-3 reverse-geocoding

以下是我的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未定义。我可以知道如何访问该地址吗?

enter image description here

1 个答案:

答案 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/