Я пытаюсь загрузить Here Maps JS-скрипты, используя Promises. У меня есть три сценария, и последние два зависят от первого и могут быть загружены асинхронно после загрузки первого. Проблема в том, что после загрузки первого скрипта функция не ждет в then () :
const libraries = {
mapsjsCore: 'http://js.api.here.com/v3/3.0/mapsjs-core.js',
mapsjsService: 'http://js.api.here.com/v3/3.0/mapsjs-service.js',
mapjsEvents: 'http://js.api.here.com/v3/3.0/mapsjs-mapevents.js'
};
const headTag = document.getElementsByTagName('head')[0];
export const loadMap = function () {
// First script loads, returns immediately and
// starts initializing the map without
// waiting the last two scripts to load ???
return getLibrary(libraries.mapsjsCore)
.then(() => Promise.all([
// Load the rest async
getLibrary(libraries.mapsjsService),
getLibrary(libraries.mapjsEvents)
])
)
.catch(error => new Error('Unable to load map files'))
}
function getLibrary(url) {
return new Promise((resolve, reject) => {
let scriptHTML = document.createElement('script');
scriptHTML.type = 'text/javascript';
scriptHTML.charset = 'utf-8';
scriptHTML.async = true;
scriptHTML.src = url;
scriptHTML.onload = function () {
resolve(url);
}
scriptHTML.onerror = function () {
reject('error')
}
headTag.appendChild(scriptHTML);
})
}
Последовательность загрузки выглядит нормально:
Итак, как заставить loadMap () ожидать then () и затем возвращаться? Даже если я оберну loadMap () в Promise и разрешу после then () , результат будет таким же? Что мне здесь не хватает?