【问题标题】:Returning value from a google maps callback function从谷歌地图回调函数返回值
【发布时间】:2011-04-26 22:13:16
【问题描述】:

您好,我正在使用谷歌地图 API 我有这么大的代码,所以我不想用代码吓跑人们 基本上这就是我需要做的

我有一个 javascript(1) 函数,在有人单击按钮后我从 Html 调用该函数, 从那个函数我做了一些处理来计算纬度和经度,并调用一个使用纬度和经度的自定义函数,并调用一个谷歌地图函数。我需要将谷歌地图回调函数中的值传递回 javascript 函数 (1)

事情是这样的

-------------File First.html----

<script type="text/javascript" src="functions.js"></script>
<script type="text/javascript">
function docalculation
{
  .....some calculations for latlng......
  var value = get_value(latlng);
}
</script>
<html>
  .....html file....
  <input type="button" value="Create Directions" onClick="docalculation()">
</html>

-------------------文件functions.js----------------

var return_val;
function get_val(latlng)
{
  geocoder = new google.maps.Geocoder();
  geocoder.geocode({'latLng': latlng}, function(results, status) {

  return_val = (results[0].address_components[i].long_name);
  alert(return_val); //here I get the value that I need in alert
  }

alert (return_val); // here the value suddenly becomes undefined
return val; // hence returns undefined
}

请帮助我被困在这里,即使经过 2 天的谷歌搜索并尝试了我所知道的一切,也找不到解决方案。

感谢任何帮助

我正在寻找的最简单的解决方案是将 return_val 的值存储到变量值中

谢谢

【问题讨论】:

  • 听起来像是变量作用域的问题,但如果没有完整的参考框架,要弄清楚它偏离轨道的地方会有点困难。
  • 有什么办法可以存储这个值(return_val).....我迫切需要解决方案

标签: javascript google-maps asynchronous


【解决方案1】:

这是因为geocode() 是异步的:它会立即返回,但一旦响应到达就会调用回调函数。您需要在get_val() 中接受回调并将值传递给此方法,而不是尝试返回它(这是不可能的):

function get_val(latlng, cb) {
    geocoder = new google.maps.Geocoder();
    geocoder.geocode({
        'latLng': latlng
    }, function (results, status) {
        cb(results[0].address_components[i].long_name);
    });
}

用法:

get_value(latlng, function(longName) {
    /* do something */
});

【讨论】:

  • 我敢打赌,关于返回值和异步函数的问题是这里最常见的 JavaScript 问题之一
  • 感谢您的回复,但是使用此解决方案我将面临另一个问题........函数返回的是道路名称......我需要做的是将第一个值存储在变量say first road中并将第二个值存储在变量say second road中并比较vars first road和second road以查看它们是否具有相同的值,我需要在循环中执行此操作好几次....感谢您的快速回复...
  • @ThiefMaster,你的用法应该是get_value( latlng, function(longName) { /*do something*/}
  • @ThiefMaster 你能推荐点别的吗
  • @Nick:你可以将多个参数传递给回调函数
【解决方案2】:

以下是您如何使用 ThiefMaster 的答案在一次通话中获取多个经度的方法。不适合胆小的人。

/**
 * @param {string[]} values longitude strings
 * @param cb {function} The callback that will be passed a 
 *        map keyed by latlng strings where each value
 *        is the long name of the street
 */
function getLongNames(values, cb) {
    var returnValues = {};
    var responseCount = 0;
    var geocoder = new google.maps.Geocoder();

    for (var i =0; i < values.length; i++) {
        getSingleName(values[i], function(latLng, longName) {
            returnValues[latLng] = longName;
            responseCount++;
            if (responseCount == values.length) {
                cb(returnValues);
            }
        });
    }

    function getSingleName(latlng, cb) {
        geocoder.geocode({
            'latLng': latlng
        }, function (results, status) {
            cb(latlng, results[0].address_components[i].long_name);
        });
    }
}

你这样称呼它

// The callback is the code that is run once all the latLng have been processed
getLongNames(["latLng1", "latLng2","latLng2"], function (valueMap) {
  for (var latLng in valueMap) {
    console.log("Latitude Longitude:" + latLng + " Long Name " + valueMap[latLng]);
  }
});

【讨论】:

  • HI Juan 感谢您的回复....您的代码有助于我在一个函数中比较两条道路,但是,在比较它们之后,我需要传递一个布尔值来确定值是否匹配,我认为使用此代码后我们无法实现......
  • @Nick:我不明白你的意思。您拥有返回的地图中的所有值。什么是你无法比较的?展示您的代码以及您实际尝试执行的操作。
  • @Juam Mendes :根据我的说法,我正在寻找这个问题的最简单的解决方案是提取我在原始代码中提到的变量 return_val 的值,并将其存储在某个变量中docalculation 函数(在原始问题中)......无论如何我可以实现......我非常感谢你的努力......如果你能感谢,请帮助我解决这个邪恶的问题
  • @Nick:按照你的说法,你错了:) 没有办法调用函数并让它返回值,这就是异步调用的本质。返回值通过回调函数传递。您需要调整代码并考虑使用回调。我们为您提供了很多关于如何操作的线索。
  • @Juan Mendes 我这意味着我必须放弃我的整个项目......如果我无法实现这个......因为我正在处理的问题的性质要求我存储值....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多