Javascript函数返回值问题

时间:2009-10-30 15:35:49

标签: javascript google-maps

我正在尝试使用google maps API并遇到一些麻烦。我创建了一个名为getPoint的函数,它接受一个地址。它使用google api将该地址转换为GPoint对象,使用GClientGeocoder.getLatLng(地址,回调)函数。 getLatLng()传递地址和回调函数,如下所示。我希望我编写的getPoint()函数返回从getLatLng()调用传递给回调函数的“point”变量。我正在努力弄清楚如何做到这一点,甚至可以做到这一点?

function getPoint(address) {
  var geocoder = new GClientGeocoder();

  return geocoder.getLatLng(
    address,
    function(point){
      return point;
    }
  );
}

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:6)

GClientGeocoder.getLatLng是一个异步操作,因此return中的getPoint语句实际上没有达到预期效果。

您必须重新构建代码以获取回调函数,在异步操作完成时调用该函数:

function getPoint(address, callback) {
    var geocoder = new GClientGeocoder();

    geocoder.getLatLng(
        address,
        function(point){
            /* asynch operation complete.
             * Call the callback with the results */
            callback(point)
        }
    );
}

甚至更好(虽然触摸更深奥):

function getPoint(address, callback) {
    var geocoder = new GClientGeocoder();

    geocoder.getLatLng(
        address,
        callback // GClientGeocoder will call the callback for you
    );
}

修改重新发表您的评论问题:

好的,这是另一个问题,但简而言之,只要您在定义地图实例的同一范围内定义函数,您传递的JavaScript函数回调就可以访问您的地图实例:

var map = new GMap2(/*...*/);
var addresses = []; // list of address strings
for(var i=0; i < addresses.length; i++) {
    getPoint(addresses[i], function(point) { // pass the callback function
        map.addOverlay(/*...*/); // map variable is in scope
    })
}

这种函数称为闭包。

答案 1 :(得分:2)

不,它无法完成。相反,你必须设置一个方法,一旦它到达未来的某个点就知道如何处理答案 - 这就是回调的本质。

所以,目前,您的设计如下:

var myPoint = getPoint(theAddress);
doSomethingWithPoint(myPoint);
doSomethingElseWithPoint(myPoint);

但现在看起来应该是

function getPoint(address, callback) {
    var geocoder = new GClientGeocoder();
    geocoder.getLatLng(address, callback);
}
getPoint(theAddress, function(myPoint) {
    doSomethingWithPoint(myPoint);
    doSomethingElseWithPoint(myPoint);
});

答案 2 :(得分:0)

你不能这样做。 getLatLng()是一个异步函数:它会在收到响应后发送HTTP请求并调用回调。同时,您的本地脚本将继续执行,并且在调用回调之前将返回getLatLng()