您好我正在使用谷歌地图API 我有这么大的代码,所以我不想用代码吓跑别人 基本上这就是我需要做的事情
我有一个javascript(1)函数,我是在有人点击按钮后从Html调用的, 从该功能我做一些处理来计算纬度和经度,并调用一个使用纬度和经度的自定义函数,并调用谷歌地图功能。我需要将谷歌地图中的值回调函数传递给javascript函数(1)
这是怎么回事
--------------文件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>
------------------- file 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的值存储到变量值的某种方式
由于
答案 0 :(得分:3)
那是因为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 */
});
答案 1 :(得分:1)
以下是如何使用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]);
}
});