JavaScript: предполагаемый выполнить функции последовательно, не на самом деле делая так?

Я вижу много ответов на 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. отдельный КРАСНЫЙ маркер появляется на карте (т.е. рендеринг add_marker)
  5. несколько СИНИХ маркеров появляются на карте (т.е. рендеринг add_markers_within_bounds)

Почему не делает add_markers_within_bounds завершенный прежде add_marker идет полным ходом: и как я могу заставить его сделать так?

Я знаю, что один путь мог бы состоять в том, чтобы звонить add_marker из add_markers_within_bounds, но по различным причинам я сохранил бы его как отдельную функцию.

1
задан Andy E 27 May 2010 в 15:18
поделиться

3 ответа

API Карт Google иногда включает отправку запроса в Google для получения данных. Если одно из этих действий включает запрос данных, оно будет отложено до завершения HTTP-запроса, а остальная часть кода продолжится без этого.

Мне кажется, что add_marker , вероятно, не требует запроса данных, поскольку вы уже предоставляете координаты, тогда как add_markers_within_bounds может включать загрузку данных, чтобы узнать, какие координаты на самом деле. Таким образом, add_marker всегда будет выполняться первым, в то время как данные для других маркеров все еще загружаются.

Я не уверен, как работает API Карт Google, но вы можете указать add_marker в качестве обратного вызова, который будет выполняться, когда все данные для add_markers_within_bounds будут готовы.

2
ответ дан 3 September 2019 в 00:16
поделиться

насколько я понимаю, вы хотите, чтобы эта функция вызывалась после выполнения первой. это может вам помочь, но я не уверен на 100%, так как не смог протестировать его для сценария, аналогичного вашему.

window.setTimeout(function () {
        add_marker();
    }, 0);

указание 0 в качестве установленного времени ожидания заставляет его выполнить его в конце

0
ответ дан 3 September 2019 в 00:16
поделиться

Возможно, операции на GMap2 асинхронны (вероятно, с A JAX)? Если это так, вам может потребоваться выполнить операцию блока после вызова, если вы хотите быть уверенным в последовательности.

0
ответ дан 3 September 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: