我已经为此苦苦挣扎了一段时间。我是 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);
}
注意: initialize 在我的 html 中被 body onload="initialize()" 调用。
所以问题是 makeMap 需要通过 Geocode 函数获得的纬度和经度值,但是我在控制台中收到一个错误,说结果是未定义的。到底是怎么回事?我来自 Java,所以我对 JS 中的数据流是如何发生的有点困惑!这将是未来的宝贵经验!
附带的问题:我应该如何在外部脚本中拆分我的函数?什么被认为是好的做法?我应该将所有函数都塞进一个外部 .js 文件中,还是应该将类似的函数组合在一起?