Google Geocode Api

时间:2012-08-13 22:25:26

标签: javascript google-maps

有人可以向我解释以下行为:

function getLatLong() 
    {
        var geocoder = new google.maps.Geocoder();
        var result = "";
        geocoder.geocode ( { 'address': "London", 'region': 'uk' }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
            result = results[0].geometry.location;
            alert('Im called second');
            } else {
               alert("Geocode was not successful for the following reason: " + status);
            }
        });

        alert('Im called first');  
        return result;
    }

第一个警报之前如何调用第二条警报消息?我有一个问题,我试图返回已赋值变量'result'的值但它仍然作为空字符串返回,即使它确实从results [0] .geometry.location分配了一个值。我有一种可怕的感觉,我错过了一些非常明显的东西:/

2 个答案:

答案 0 :(得分:1)

geocoder.geocode()是一种异步方法,意味着它会立即返回而不会阻塞,但只有在地理编码调用(可能是Google的地理编码服务)完成后才会运行指定的函数。

正在发生的事情是在另一个呼叫完成之前调用alert('Im called first')呼叫,很可能是因为地理编码呼叫必须通过互联网。这两个调用的顺序可能会有所不同,完全取决于地理编码需要多长时间才能完成。

要解决此问题,您无法从此函数返回结果。相反,您需要在完成地理编码时提供要调用的函数以充当回调,以便您可以使用现在填充的结果。

e.g。

function getLatLong(completeCallback) 
{
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode ( { 'address': "London", 'region': 'uk' }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var result = results[0].geometry.location;
            completeCallback(result);
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}

答案 1 :(得分:1)

o原因是调用geocoder.geocode使用回调来传递结果。对geocoder.geocode的调用只持续足够长的时间向地理编码器服务发送请求,然后继续执行下一个(非回调)行,即“我称之为第一”警报。回调中的所有代码都“保存以供日后使用”,并在收到地址解析器响应时调用。

您必须相应地编写代码。您不必从原始函数调用返回结果,而是必须在回调中获取结果并从那里继续处理。它可以使javascript控制流程难以理解。