Я пытаюсь добавить ломаную линию к созданной карте Google. Координаты ломаной линии берутся из файла JSON на моем веб-сервере с помощью jQuery (функция getJSON). Однако у меня проблемы с обратными вызовами. Я определил три функции в отдельном файле JavaScript, а именно:
function initMap(callback) {
map = new google.maps.Map(document.getElementById('map-canvas'), {
center: {lat: 34.397, lng: 150.644},
scrollwheel: false,
zoom: 2
});
callback();
}
.
function setPath(callback) {
$.getJSON('./expOneActivityData.json',
function (data) {
//Some looping contstruct to navigate through my JSON file.
}
})
callback();
};
.
function addPath() {
var trekLine = new google.maps.Polyline({
path: expeditionCoordinates,
geodisc: true,
stokeColor: '#FF0000',
strokeOpacity: 1.0,
strokeWeight: 2
});
trekLine.setMap(map);
}
ExpeditionCoordinates - это массив, каждый элемент которого является объектом со свойством latitude и longitude. Это объявлено как глобальная переменная, при этом инициализация значения происходит в цикле setPath ().
В моем HTML-файле у меня есть:
<script src="https://maps.googleapis.com/maps/api/js?key=myKey&callback=initMap">
When I try to replace initMap with initMap(setPath(addPath)) in the script tag, I get a 400 Bad request from Google. Ofcourse having just "callback=initMap" in the script tag gives a:
TypeError: callback is not a function
происходит в строке с callback () в определении initMap.
Итак, как я могу передать функцию в googleapis, где сама функция также имеет обратные вызовы? (Моя конструкция цикла в порядке, кстати). Я попытался добавить defer к тегу скрипта googleapi, а также к тому, который ссылается на мой файл JavaScript. Я удалил все обратные вызовы и выполнил только цикл. Я надеялся, что массив ExpeditionCoordinates завершит инициализацию до того, как тег скрипта googleapi будет исключен, хотя это тоже не сработало (карта все еще загружается, только без ломаной линии).
Я новичок в Javascript и его асинхронном характере, хотя я понимаю, как они работают, и успешно работал с ними на базовом уровне в течение недели или около того.
(Что на самом деле приводит меня к побочному вопросу. До сих пор я работал только с одним обратным вызовом. Я ожидал чего-то вроде:
initMap(setPath)
для работы, поскольку setPath не имеет прикрепленного (), когда его определение передается в качестве параметра, и, следовательно, не выполняется немедленно. Хотя добавление набора скобок в setPath, поскольку он также требует обратного вызова (addPath), будет означать, что он будет немедленно исключен?)
initMap
) для асинхронного загрузчика не может принимать никаких аргументов, это указатель на функцию. - person geocodezip   schedule 20.12.2015