我在StackOverflow上看到很多答案,说JavaScript按顺序执行代码,但我实际上可以看到我自己的JavaScript没有这样做。从以下代码:
function centre_map(lat, lng, zoom_level) {
alert('centre_map');
map = new GMap2(document.getElementById('map_canvas'));
var latlng = new GLatLng(lat, lng);
map.setCenter(latlng, zoom_level);
}
function add_markers_within_bounds() {
alert('add_markers_within_bounds');
// add numerous BLUE markers within map bounds using MarkerClusterer
}
function add_marker(lat, lng, place_name, grid, county) {
alert('add_marker');
// add one ordinary RED Google Maps marker
}
centre_map('{{lat}}', '{{lng}}', 12);
add_markers_within_bounds('{{grid}}', '{{place_name}}');
add_marker('{{lat}}', '{{lng}}', '{{place_name}}', '{{grid}}', '{{county}}');
我得到以下事件序列:
为什么在add_markers_within_bounds
开始之前add_marker
没有完成:我怎样才能这样做?
我知道一种方法可能是在 add_marker
内从调用add_markers_within_bounds
,但出于各种原因,我宁愿将其作为单独的函数保留。
答案 0 :(得分:2)
Google Maps API有时会向Google发送请求以获取数据。如果其中一个操作涉及请求数据,它将被延迟,直到HTTP请求完成,其余代码将在没有它的情况下继续。
在我看来,add_marker
可能不涉及请求数据,因为您已经提供了坐标,而add_markers_within_bounds
可能涉及下载数据以了解坐标实际是什么。因此,add_marker
将始终首先发生,而其他标记的数据仍在忙着下载。
我不确定Google Maps API的工作原理,但您可以将add_marker
指定为add_markers_within_bounds
的所有数据准备就绪后发生的回调。
答案 1 :(得分:0)
也许GMap2
上的操作是异步的(可能是 A JAX)?如果是这样,如果您想确定顺序,则可能需要在调用后进行块操作。
答案 2 :(得分:0)
据我所知,你希望在执行前者之后调用该函数。这可能会对你有所帮助,但我并不是100%肯定,因为我无法测试它与你的情况类似。
window.setTimeout(function () {
add_marker();
}, 0);
设置0作为设置超时的时间迫使它在结束时执行它