<script src="/js/site.js?v=EtZhOXlkRte5HDRXpfS7rDy3ua0sbCvtNJUaIlNsSXw"></script>
<script>
var init;
$(function () {
var adpSummaryListenerId;
init = _initializeDirections;
initializeAdpSummaryListener();
function _initializeDirections() {
console.log("test"); //we don't get here, sometimes
var origin = {
isGoogle: $("#origin-isgoogle").val(),
coordinate: new google.maps.LatLng(@origin.Latitude, @origin.Longitude),
address: "@origin.StreetAddress",
marker: "@origin.MarkerName"
}, destination = {
isGoogle: $("#destination-isgoogle").val(),
coordinate: new google.maps.LatLng(@destination.Latitude, @destination.Longitude),
address: "@destination.StreetAddress",
marker: "@destination.MarkerName"
}, start = {
value: origin.isGoogle ? origin.address : origin.coordinate,
pos: origin.coordinate,
marker: origin.marker
}, end = {
value: destination.isGoogle ? destination.address : destination.coordinate,
pos: destination.coordinate,
marker: destination.marker
};
console.log("Initializing directions");
initializeDirections(start, end); //in site.js
}
function initializeAdpSummaryListener() {
adpSummaryListenerId = window.setInterval(addNavigateButton, 500);
}
function addNavigateButton() {
console.log("checking for .adp-summary");
if ($(".adp-summary").length) {
$(".adp-summary").append($("#start-navigation").html());
clearInterval(adpSummaryListenerId);
}
}
});
</script>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=@(Model.GoogleMapsApiKey)&callback=init"></script>
Я не могу понять, почему, несмотря на ссылку на скрипт карт после встроенного скрипта, обратный вызов API Карт Google init
иногда не создается до того, как Google попытается вызвать его.
Это ошибка, которую я получаю:
Uncaught (in promise)
ld {message: "init is not a function", name: "InvalidValueError", stack: "Error at new ld (https://maps.googleapis.com/.......&callback=init:141:124"}
Ранее у меня было имя обратного вызова как initializeMap
как ссылка, объявленная на сайте. js (но все еще инициализированная здесь в встроенный сценарий), но перенес его сюда для краткости и изоляции, надеясь, что смогу разобраться в проблеме. Но та же проблема сохраняется.
Я понимаю , что async
направляет API-интерфейс для извлечения параллельно с синтаксическим анализом и оценкой, как только он становится доступным, но он не должен быть доступен до встроенного сценария, верно?
Я также понимаю, что defer
означает, что API не будет выполняться до тех пор, пока документ не будет проанализирован, поэтому он еще не должен быть доступен.
Я видел это о defer
:
Этот атрибут позволяет исключить блокировку синтаксического анализатора JavaScript, когда браузер должен будет загружать и оценивать скрипты, прежде чем продолжить анализ. asyn c имеет аналогичный эффект в этом случае.
Но defer
по-прежнему не должен препятствовать выполнению встроенного скрипта первым, потому что он только позволяет JavaScript , чтобы не иметь необходимости быть блокирующим парсер , если атрибут используется для встроенного тега <script>
.
Так что я в растерянности.