Javascript 使用承诺的顺序脚本加载

Javascript 使用承诺的顺序脚本加载,javascript,promise,here-api,Javascript,Promise,Here Api,我试图在这里加载映射JS脚本使用承诺。我有三个脚本,最后两个脚本依赖于第一个脚本,可以在第一个脚本加载后异步加载。问题是在第一个脚本加载后,它没有等待then()中的函数: const库={ 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.he

我试图在这里加载映射JS脚本使用承诺。我有三个脚本,最后两个脚本依赖于第一个脚本,可以在第一个脚本加载后异步加载。问题是在第一个脚本加载后,它没有等待then()中的函数:

const库={
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=函数(){
//第一个脚本加载并立即返回
//开始初始化映射而不使用
//正在等待加载最后两个脚本???
返回getLibrary(libraries.mapsjsCore)
.然后(()=>保证([
//异步加载其余部分
getLibrary(libraries.mapsjsService),
getLibrary(libraries.mapjsEvents)
])
)
.catch(错误=>新错误('无法加载映射文件'))
}
函数getLibrary(url){
返回新承诺((解决、拒绝)=>{
让scriptHTML=document.createElement('script');
scriptHTML.type='text/javascript';
scriptHTML.charset='utf-8';
scriptHTML.async=true;
scriptHTML.src=url;
scriptHTML.onload=函数(){
解析(url);
}
scriptHTML.onerror=函数(){
拒绝('错误')
}
headTag.appendChild(脚本HTML);
})

}
根据您的上述评论,您似乎尝试了:

loadMap().then(initMap());
但是这里的问题是
initMap()
将立即执行。应使用以下语法:

loadMap().then(initMap);
initMap
功能仅在映射全部加载后执行

下面是一个完整的工作示例

const库={
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];
const loadMap=函数(){
//第一个脚本加载并立即返回
//开始初始化映射而不使用
//正在等待加载最后两个脚本???
返回getLibrary(libraries.mapsjsCore)
.然后(()=>保证([
//异步加载其余部分
getLibrary(libraries.mapsjsService),
getLibrary(libraries.mapjsEvents)
])
)
.catch(错误=>新错误('无法加载映射文件'))
}
函数getLibrary(url){
返回新承诺((解决、拒绝)=>{
让scriptHTML=document.createElement('script');
scriptHTML.type='text/javascript';
scriptHTML.charset='utf-8';
scriptHTML.async=true;
scriptHTML.src=url;
scriptHTML.onload=函数(){
log(`Loaded:${url}`);
解析(url);
}
scriptHTML.onerror=函数(){
拒绝('错误')
}
headTag.appendChild(脚本HTML);
})
}
函数initMap(){
log(`initMap`);
}
loadMap()。然后(initMap);
//这张照片
//加载:http://js.api.here.com/v3/3.0/mapsjs-core.js
//加载:http://js.api.here.com/v3/3.0/mapsjs-service.js
//加载:http://js.api.here.com/v3/3.0/mapsjs-mapevents.js

//initMap
到底出了什么问题?什么是
then
块的“未等待”?脚本本身?脚本加载后将立即运行,不过由于承诺链,它们将按顺序加载。
loadMap
不会等待,这是承诺的标准行为。你为什么要等?您是否需要在
承诺完成后执行某些操作?所有的
都完成了?链应该如下:load(1.js)。然后(load(2.js,3.js)。然后(initMap())。我现在拥有以下内容:加载(1.js)。然后加载(initMap())。然后加载(2.js,3.js))。所以问题是,在第一个脚本加载之后,loadMap()返回并开始初始化映射,而不等待最后两个脚本加载。示例脚本中没有
initMap()
。正如@Evert提到的,没有
initMap()
。上面显示的代码看起来很好,运行起来和我预期的一样。演示如何在此上下文中使用
initMap()