2011-04-26 131 views
0

嗨,我与谷歌地图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 
} 

请帮助我卡在这里,即使经过两天的谷歌搜索和尝试,仍然找不到解决方案克我所知道的一切。

任何帮助赞赏感谢

,我正在寻找最简单的解决办法是一些方法来RETURN_VAL的值保存到变量值

感谢

+0

听起来像一个变量范围的问题,但没有参考的全画幅这将是一个有点难以揣摩出它会出轨。 – Femi 2011-04-26 22:16:46

+0

有什么方法可以存储这个值(return_val).....我需要解决方案拼命 – koool 2011-04-26 23:13:29

回答

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 */ 
}); 
+0

+1 - 打我吧:-) – 2011-04-26 22:18:10

+1

我敢打赌,有关返回值和异步函数的问题是最重要的这里常见的JavaScript问题 – 2011-04-26 22:22:47

+0

感谢您的回复,但还有一个问题我将面临使用这个解决方案........ 函数返回的是路的名字...... 我需要做的是将第一个值存储在变量say first road中,并将第二个值存储在变量say second road中,并比较变量first和road,看看它们是否具有相同的值,并且我需要在循环几次....感谢您的快速回复,虽然... – koool 2011-04-26 22:28:59

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]); 
    } 
}); 
+0

HI胡安感谢您的回复....您的代码可以帮助我比较两个道路的功能,但是,在比较它们之后,我需要传递一个布尔值来确定值是否匹配,而我不要以为我们可以在使用此代码后实现这一目标.......... – koool 2011-04-26 23:26:37

+0

@Nick:我不明白你的意思,你在返回的地图中拥有所有的值,它是什么,你不能 – 2011-04-26 23:29:02

+0

@Juam Mendes:根据我最简单的解决方案,我正在寻找这个问题是提取变量return_val的值的一些方法,我在原代码,并将其存储在某个变量中的docalculation函数中(原始问题)......无论如何,我可以实现这一点......我真的很感谢你的努力....请帮助我邪恶的问题,如果你可以感谢 – koool 2011-04-26 23:29:52