JavaScript: должен выполнять функции последовательно, на самом деле не так? - PullRequest
1 голос
/ 27 мая 2010

Я вижу много ответов в 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' alert
  2. 'add_markers_within_bounds' alert
  3. предупреждение 'add_marker'
  4. отдельный красный маркер появляется на карте (т.е. рендеринг add_marker)
  5. несколько синих маркеров появляются на карте (то есть рендеринг add_markers_within_bounds)

Почему'add_markers_within_bounds завершено до начала add_marker: и как я могу это сделать?

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

Ответы [ 3 ]

2 голосов
/ 27 мая 2010

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

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

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

0 голосов
/ 27 мая 2010

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

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

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

0 голосов
/ 27 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...