Javascript嵌套函数 - 需要帮助返回结果

时间:2010-11-30 00:34:01

标签: javascript function callback

我正在尝试创建一个函数来从Google Maps JS API(v3)返回lat / long数组。我可以写出从API检索的数据,但是我无法将数据传递给变量。我想做这样的事情:

var latLong = getLatLong(Address);

我创建的功能在这里:

function getLatLong(loc, callback) {
  var geocoder = new google.maps.Geocoder();
  var array = new Array();

  if (geocoder) {
    geocoder.geocode({ 'address': loc }, function (results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var latLng = results[0].geometry.location;;
        $.each(latLng, function(k, v) {
          if (k == 'va' || k == 'wa') {
            array.push(v);
          }
        });
        var ret = array;
        callback(ret);
      } else {
        console.log("Geocoding failed: " + status);
      }
    });
  }
}

然后我将函数分配给变量并调用它来给我lat / long。

var geo = getLatLong('Dallas, TX', function(result) {
  return result;
});

不幸的是,这会产生“未定义”的结果。我可以在函数中访问结果,我只是无法传递它。如何将函数的结果传递给要访问的变量?

4 个答案:

答案 0 :(得分:3)

  

不幸的是,这会产生'未定义'的结果

你的意思是'geo'变量吗?如果是这样,你就错过了回调点。在getLatLong()调用返回后,您传入的函数将被称为以后。回调是异步函数,您将需要使用回调来执行您选择的操作(例如,更改状态,调整显示等)。

尝试将其更改为

function(result) { alert('callback result: '+result); }

检查它是否被正确调用。如果你正确得到alert(),那么你可能想要这样做:

var geo = null;
getLatLong('Dallas, TX', function(result) {
   // cache state
   geo = result;
   // do something with it
   showResultInSomeSpotOnThePage(result);
});
/* We can't use the "geo" variable contents immediately
 * after getLatLong returns; it will be set at some time later.
 * But there may be some use for keeping the result around indefinitely,
 * we just have to be prepared for "geo" to be null if we check it
 * before the callback is called.
 */

答案 1 :(得分:3)

您无法按照自己的方式构建代码。问题是geocoder.geocode()异步操作。这就是它需要回调函数的原因。当您致电geocoder.geocode()时,启动获取地理编码的请求,然后返回,让请求在后台运行。当请求最终完成时,google的api会将您传递的匿名函数作为第二个参数执行到geocode()

所以,当你致电getLatLong()时,事情发生的实际顺序是这样的:

  1. 致电geocoder.geocode()。 (发起地理编码请求)
  2. getLatLong()已完成并返回undefined。 (这是设置geo的地方)
  3. (地理编码请求完成)google api调用匿名函数,该函数将LatLng值推送到array,然后调用callback()
  4. 为了更好地可视化正在发生的事情,您可以按如下方式编写代码(这与您编写代码的方式完全相同):

    function getLatLong(loc, callback) {
      var geocoder = new google.maps.Geocoder();
      var array = new Array();
    
      function handleGeocodeResponse(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          var latLng = results[0].geometry.location;;
          $.each(latLng, function(k, v) {
            if (k == 'va' || k == 'wa') {
              array.push(v);
            }
          });
          var ret = array;
          callback(ret);
        }
      }
    
      if (geocoder) {
        geocoder.geocode({ 'address': loc }, handleGeocodeResponse);
      } else {
        console.log("Geocoding failed: " + status);
      }
    
      // note- no return specified explicitly is the same as
      //return undefined;
    }
    

    因此,如果您无法返回值,那么您如何使用结果?像这样:

    getLatLong('Dallas, TX', function(geo) {
      // geo is passed to this function as a parameter
      // move all code that requires `geo` into this function.
    
    });
    

答案 2 :(得分:1)

这里的关键点是getLatLong不返回值。这就是geo始终未定义的原因。

要使其工作,您需要修改回调函数。像这样:

getLatLong('Dallas, TX', function(result)
{
    var geo = result; 
    //continue to use geo here as you normally would
});

答案 3 :(得分:0)

geo未定义,因为getLatLong()不返回任何内容(这意味着它返回undefined)。