0

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

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;
    }

在第一个警报之前如何调用第二个警报消息?我有一个问题,我试图返回分配的变量“结果”的值,但它仍然作为空字符串返回,即使它确实从结果 [0].geometry.location 分配了一个值。我有一种可怕的感觉,我在这里遗漏了一些非常明显的东西:/

4

2 回答 2

1

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

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

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

例如

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);
        }
    });
}
于 2012-08-13T22:34:17.140 回答
1

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

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

于 2012-08-13T22:36:56.823 回答