问题
根据官方的文档的异步示例,使用callback参数回调,无法确定其他script的加载完成
错误写法
const script = document.createElement('script')
const script2 = document.createElement('script')
script.type = "text/javascript";
script2.type = "text/javascript";
script.src = `https://map.qq.com/api/gljs?v=1.exp&key=${process.env.VUE_APP_MAP_KEY}&libraries=geometry&callback=initMap`
script2.src = `https://apis.map.qq.com/tools/geolocation/min?key=${process.env.VUE_APP_MAP_KEY}&referer=myapp`
document.body.appendChild(script)
document.body.appendChild(script2)
使用两个callback会很奇怪,不能顺利解决异步问题
解决方法
使用script的onload方法,并使用promise封装
// 添加script
addScript(src){
return new Promise( resolve => {
const script = document.createElement('script')
script.type = "text/javascript";
script.src = src
document.body.appendChild(script)
script.onload = () => resolve()
})
}
const p1 = this.addScript(`https://map.qq.com/api/gljs?v=1.exp&key=${process.env.VUE_APP_MAP_KEY}&libraries=geometry`)
const p2 = this.addScript(`https://apis.map.qq.com/tools/geolocation/min?key=${process.env.VUE_APP_MAP_KEY}&referer=myapp`)
await Promise.all([p1, p2])
this.initMap() //所有script加载完成后执行的方法