有人可以向我解释以下行为:
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分配了一个值。我有一种可怕的感觉,我错过了一些非常明显的东西:/
答案 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控制流程难以理解。