因項目需求,需要異步加載百度地圖相關js
文件,因為BMapLib
和BMap
之間存在依賴關系,需要BMap加載完成之后在加載lib相關文件。
// load.js
let promise;
let count = 0, libs = [
'http://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js',
'http://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js',
'http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js'
];
const head = document.getElementsByTagName('head')[0];
function loadLib(src, resolve, reject) {
const lib = document.createElement('script');
lib.setAttribute('type', 'text/javascript');
lib.setAttribute('src', src);
lib.onerror = function() {
reject('地圖初始化失敗');
}
lib.onload = function() {
count += 1;
if (count === libs.length) { // libs全部加載成功才返回
resolve({BMap: window.BMap, BMapLib: window.BMapLib});
}
}
head.appendChild(lib);
}
export default function loadMap() {
if (promise) return promise;
promise = new Promise((resolve, reject) => {
if (window.BMap && Window.BMapLib) {
// 已經加載則直接返回
console.log('map already exist');
resolve({BMap: window.BMap, BMapLib: window.BMapLib});
} else {
// 異步加載
console.log('async load map');
const bmap = document.createElement('script');
bmap.type = 'text/javascript';
bmap.src = 'http://api.map.baidu.com/api?v=3.0&ak=yoursak&callback=MapLoadSuccess';
head.appendChild(bmap);
window.MapLoadSuccess = function() {
// BMap加載完成,開始加載libs
libs.forEach(lib => {
loadLib(lib, resolve, reject);
})
}
bmap.onerror = function() {
reject('地圖初始化失敗');
}
}
})
return promise;
}