Я вижу много ответов на 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
, но по различным причинам я сохранил бы его как отдельную функцию.
API Карт Google иногда включает отправку запроса в Google для получения данных. Если одно из этих действий включает запрос данных, оно будет отложено до завершения HTTP-запроса, а остальная часть кода продолжится без этого.
Мне кажется, что add_marker
, вероятно, не требует запроса данных, поскольку вы уже предоставляете координаты, тогда как add_markers_within_bounds
может включать загрузку данных, чтобы узнать, какие координаты на самом деле. Таким образом, add_marker
всегда будет выполняться первым, в то время как данные для других маркеров все еще загружаются.
Я не уверен, как работает API Карт Google, но вы можете указать add_marker
в качестве обратного вызова, который будет выполняться, когда все данные для add_markers_within_bounds
будут готовы.
насколько я понимаю, вы хотите, чтобы эта функция вызывалась после выполнения первой. это может вам помочь, но я не уверен на 100%, так как не смог протестировать его для сценария, аналогичного вашему.
window.setTimeout(function () {
add_marker();
}, 0);
указание 0 в качестве установленного времени ожидания заставляет его выполнить его в конце
Возможно, операции на GMap2
асинхронны (вероятно, с A JAX)? Если это так, вам может потребоваться выполнить операцию блока после вызова, если вы хотите быть уверенным в последовательности.