【问题标题】:Javascript function return value problemJavascript函数返回值问题
【发布时间】:2009-10-30 15:35:48
【问题描述】:

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

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

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

提前感谢您的帮助!

【问题讨论】:

    标签: javascript google-maps


    【解决方案1】:

    GClientGeocoder.getLatLng 是一个异步操作,所以getPoint 中的return 语句实际上不能满足你的期望。

    你必须重构你的代码来获取一个回调函数,当异步操作完成时调用它

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

    这种风格的函数称为闭包。

    【讨论】:

    • 感谢您的好评。这导致我想到另一个问题......我有一个名为 Initialize() 的函数,它被称为创建 GMap2 对象的主体的 onLoad() 。然后我做一个 ajax post 来检索地址列表,然后遍历这些地址并一个接一个地创建一个 GPoint 对象,以便我可以为每个地址添加一个 GMarker 到 GMap2。您说的我应该指定的回调函数不需要访问该 GMap 对象吗?如果是这样,我如何在回调函数的范围内获取 GMap2 对象?
    • 没关系,地图不在我认为的范围内。谢谢!
    • 天哪,我刚刚对您的评论进行了完整的回复。
    【解决方案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);
    });
    

    【讨论】:

    • +1;但是你的匿名回调函数需要一个“myPoint”参数。
    • 天啊!谢谢。 15 个字符。 15 个字符。 15 个字符。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多