JavaScript:应该按顺序执行函数,而不是实际执行?

时间:2010-05-27 15:14:24

标签: javascript google-maps

我在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}}');

我得到以下事件序列:

  1. 'centre_map'提醒
  2. 'add_markers_within_bounds'提醒
  3. 'add_marker'提醒
  4. 单个RED标记出现在地图上(即add_marker渲染)
  5. 多个蓝色标记出现在地图上(即add_markers_within_bounds渲染)
  6. 为什么在add_markers_within_bounds开始之前add_marker没有完成:我怎样才能这样做?

    我知道一种方法可能是在 add_marker内从调用add_markers_within_bounds,但出于各种原因,我宁愿将其作为单独的函数保留。

3 个答案:

答案 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作为设置超时的时间迫使它在结束时执行它