【发布时间】:2012-11-07 10:53:11
【问题描述】:
我已经为此苦苦挣扎了一段时间。我是 Javascript 新手,并且一直认为我编写的代码一直在异步运行。这是一个通用示例:
我在函数 a 中运行了一些代码。然后函数 A 调用函数 B,后者需要将一个变量返回给 A,以便 A 可以在以后的操作中使用它。似乎当 A 调用 B 时,它仍然继续运行自己的代码,而不是等待它的返回值被阻塞,并且 B 的速度不够快,以至于 A 最终到达了它需要使用返回值的点值,我得到一个未定义的变量类型错误。
我解决这个问题的方法是让函数 A 调用函数 B,然后调用函数 C,该函数 C 将执行 A 对返回值执行的后续操作......我有点序列化我的通过调用而不是返回来编写代码……虽然这很麻烦……
以下是实际代码中发生这种情况的示例:
function initialize() {
//Geocode Address to obtin Lat and Long coordinates for the starting point of our map
geocoder = new google.maps.Geocoder();
var results = geocode(geocoder);
makeMap(results[0].geometry.location.lat(), results[0].geometry.location.lng());
}
function geocode(geocoder) {
//do geocoding here...
var address = "3630 University Street, Montreal, QC, Canada";
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
return results;
}
else {
alert("Geocode was not successful for the following reason: " + status);
}
});
}
function makeMap(lat, long) {
// alert(lat); for debuging
var mapOptions = {
center: new google.maps.LatLng(lat, long),
zoom: 17,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"),
mapOptions);
}
注意: 在我的 html 中,初始化被 body onload="initialize()" 调用。
所以问题是 makeMap 需要通过 Geocode 函数获得的纬度和经度值,但我在控制台中收到一个错误,说结果未定义。到底是怎么回事?我来自 Java,所以我对 JS 中的数据流是如何发生的有点困惑!这将是未来的宝贵经验!
关于一个附带问题:我应该如何在外部脚本中拆分我的函数?什么被认为是好的做法?我应该将所有函数都塞进一个外部 .js 文件中,还是应该将类似的函数组合在一起?
【问题讨论】:
-
好的,谢谢,我是新来的!
标签: javascript asynchronous callback asynccallback