異步加載百度地圖以及第三方庫


因項目需求,需要異步加載百度地圖相關js文件,因為BMapLibBMap之間存在依賴關系,需要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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM