2010-06-07 51 views
26

我正在使用google maps API,只要我将变量返回给codeLatLng函数的初始化函数,它声明未定义。如果我从codeLatLng打印变量,它显示正常。如何从Google Maps JavaScript geocoder回调中返回变量?

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    var addr = codeLatLng(); 
    document.write(addr); 

    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       return results[1].formatted_address; 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

打印出不确定

如果我做的:

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(); 


    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       document.write(results[1].formatted_address); 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

打印出纽约,NY 10012,USA

回答

44

您不能返回从函数的值,该值还不时存在函数返回。

geocode方法使一个asynchonous通话,并使用一个回调来处理结果,所以你必须做同样的codeLatLng功能:

var geocoder; 
function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(function(addr){ 
    alert(addr); 
    }); 
} 

function codeLatLng(callback) { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
    geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     if (results[1]) { 
      callback(results[1].formatted_address); 
     } else { 
      alert("No results found"); 
     } 
     } else { 
     alert("Geocoder failed due to: " + status); 
     } 
    }); 
    } 
} 
+0

是吗?可能返回addr的值?我应该如何将addr分配给变量? – AbtPst 2016-02-17 22:32:19

+0

@AbtPst:在异步调用中不能返回任何结果,因为调用在返回结果之前返回。我在哪里放置了alert(addr);'是你可以使用结果的地方。可以将值分配给全局变量,但是您仍然需要等待该值到达。对, – Guffa 2016-02-18 00:33:07

+0

是的,没关系。实际上我有一个拉特朗数值的数组。我想迭代地处理数组并不断地将地址添加到列表中。顺便说一下,有没有办法一次性反转地理编码的纬度值数组?以及如何将addr分配给全局变量?我可以只在函数内执行x = addr吗? – AbtPst 2016-02-18 00:39:18

-2

这回不是从codeLatLng返回;它从传递给geocoder.geocode的匿名函数返回。

我想你需要使用其他机制来传递数据,例如一个全局变量

0

将geocoder作为参数传递给codeLatLng()函数。

function codeLatLng(geocoder) { 

调用它像这样在你的初始化函数:

var addr = codeLatLng(geocoder); 
11

你正在做一个异步请求,你codeLatLng()功能已完成,地理编码完成之前返回长。

如果您需要的地理编码数据继续,你就得链的功能整合在一起:

function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    codeLatLng(); 
} 
function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
        if (results[1]) { 
         initContinued(results[1].formatted_address); 
        } else { 
         alert("No results found"); 
        } 
       } else { 
        alert("Geocoder failed due to: " + status); 
       } 
     }); 
     } 

} 
function initContinued(addr) { 
    alert(addr); 
} 
1

geocode函数使用回调(function(results, status) { ... }),这是当geocode函数完成其工作时被调用。因此,当您从此回调中返回一个值时,它只会将其返回到geocode函数,而不是codeLatLng之外。

有了这个,你有几种选择:在codeLatLng定义一个变量,并将其设置在回调函数,例如:

function codeLatLng() 
{ 
    var returnValue; 
    geocoder.geocode({'latLng': latlng}, function(results, status) { returnValue = results[1].formatted_address }); 
    return returnValue; 
} 

或者你直接需要的结果在回调函数的东西。或者把结果放到一个全局变量中。 (此外,如果geocode函数是异步的 - 如果它立即返回并且之后调用回调,则需要执行后两项中的一项,在这种情况下,不能返回codeLatLng中的值。)

+1

你的代码示例不起作用。当变量返回时,它的值没有被设置,这在稍后的回调函数中会发生。使用全局变量可以返回值,但问题在于,当变量中的值可用时,代码不会得到任何信号。该函数被调用后,该值不可立即使用。 – Guffa 2010-06-08 05:41:53

+0

这就是为什么我说,如果地理编码是异步的(我不知道它是否是),他应该使用其他两种方法,全局变量或做回调中的东西。虽然我承认我没有指出全球变数他不会得到任何信号,所以他必须定期检查它。 – 2010-06-08 10:15:04