Javascript函数返回值问题

Rya*_*yan 3 javascript google-maps

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

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

  return geocoder.getLatLng(
    address,
    function(point){
      return point;
    }
  );
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

Roa*_*rth 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)
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

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

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

    geocoder.getLatLng(
        address,
        callback // GClientGeocoder will call the callback for you
    );
}
Run Code Online (Sandbox Code Playgroud)

编辑您的评论问题:

好的,这是另一个问题,但简而言之,只要您在定义了映射实例的同一范围内定义函数,您传递的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
    })
}
Run Code Online (Sandbox Code Playgroud)

这种函数称为闭包.

  • 啊,基督,我只是对你的评论打了一个完整的回复. (2认同)