成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

動(dòng)態(tài)加載javascript文件時(shí),如何讓文件順序執(zhí)行

TwIStOy / 818人閱讀

摘要:通過分析我覺得原因應(yīng)該是這樣的雖然我是按數(shù)組中定義的順序去動(dòng)態(tài)創(chuàng)建標(biāo)簽去加載對(duì)應(yīng)的文件,但是由于文件的大小以及網(wǎng)絡(luò)等因素,導(dǎo)致各個(gè)文件現(xiàn)在完成的次序并不完全等于請(qǐng)求的次序。

之前在寫js代碼時(shí),想通過代碼動(dòng)態(tài)向html中插入一定數(shù)量的js文件,文件的依賴關(guān)系已經(jīng)按順序排好,關(guān)鍵代碼大致如下:

var jsFiles = ["somepath/a.js","somepath/b.js",...];
var head = document.head;
jsFiles.forEach((file) => {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = file;
    head.appendChild(script);
});

但是在代碼執(zhí)行的過程中,很高頻率的報(bào)同一個(gè)錯(cuò),大概的意思就是說:b.js在執(zhí)行的時(shí)候引用的a.js中的方法不存在。錯(cuò)誤出現(xiàn)的評(píng)率很高,但也不是100%出錯(cuò)。
通過分析我覺得原因應(yīng)該是這樣的: 雖然我是按數(shù)組中定義的順序去動(dòng)態(tài)創(chuàng)建script標(biāo)簽去加載對(duì)應(yīng)的js文件,但是由于文件的大小以及網(wǎng)絡(luò)等因素,導(dǎo)致各個(gè)文件現(xiàn)在完成的次序并不完全等于請(qǐng)求的次序。比如上面的例子中,如果a.js文件比較大,下載的比b.js慢,這樣當(dāng)b.js下載完成并開始執(zhí)行的時(shí)候,他所依賴的a.js中的變量或方法就會(huì)獲取不到。
想到的解決方法就是,等前一個(gè)文件加載完畢之后再去加載下一個(gè)文件,大致代碼如下:

function loadJsFiles(jsFiles) {
    return new Promise((resolve, reject) => {
        var load = function(i) {
            var file = jsFiles[i];
            var script = document.createElement("script");
            script.type = "text/javascript";
            script.onload = function() {
                i++;
                if(i === jsFiles.length) {
                    resolve();
                } else {
                     load(i);
                }
            }
            script.src = file;
            head.appendChild(script);
        };
        load(0);
    });
    
}

上面的方法也可以改為鏈?zhǔn)降腜romise調(diào)用或者回調(diào)嵌套,雖然最終解決了問題,但是有一個(gè)問題,文件從異步加載變成了同步加載,增加了的文件下載的時(shí)間,文件越多的時(shí)候影響越明顯。所以正確的思路應(yīng)該是異步加載文件,但是執(zhí)行一個(gè)文件的時(shí)候需要等到它所依賴的文件加載完畢并首先執(zhí)行,對(duì)于這個(gè)問題,大家可以借鑒第三方庫如require.js, 或者es6中引入的模塊化功能完美解決這些問題。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/53577.html

相關(guān)文章

  • 動(dòng)態(tài)加載javascript文件時(shí),如何文件順序執(zhí)行

    摘要:通過分析我覺得原因應(yīng)該是這樣的雖然我是按數(shù)組中定義的順序去動(dòng)態(tài)創(chuàng)建標(biāo)簽去加載對(duì)應(yīng)的文件,但是由于文件的大小以及網(wǎng)絡(luò)等因素,導(dǎo)致各個(gè)文件現(xiàn)在完成的次序并不完全等于請(qǐng)求的次序。 之前在寫js代碼時(shí),想通過代碼動(dòng)態(tài)向html中插入一定數(shù)量的js文件,文件的依賴關(guān)系已經(jīng)按順序排好,關(guān)鍵代碼大致如下: var jsFiles = [somepath/a.js,somepath/b.js,...]...

    Tangpj 評(píng)論0 收藏0
  • 動(dòng)靜分離的數(shù)據(jù)并發(fā)加載策略

    摘要:關(guān)于動(dòng)靜分離的描述,這里推薦一篇不錯(cuò)的博文網(wǎng)站靜態(tài)化處理動(dòng)靜分離策略。這里的解決辦法則是采用的屬性,將其應(yīng)用于數(shù)據(jù)請(qǐng)求相關(guān)的上,就可以達(dá)到腳本與數(shù)據(jù)并發(fā)加載的效果。 作者:莫冠釗 轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接和作者信息 前言 當(dāng)今許多大型網(wǎng)頁應(yīng)用尤其是SPA均采用了動(dòng)靜分離的策略。關(guān)于動(dòng)靜分離的描述,這里推薦一篇不錯(cuò)的博文 網(wǎng)站靜態(tài)化處理—?jiǎng)屿o分離策略。 本人是做前端的,之前有幸與一...

    Object 評(píng)論0 收藏0
  • 動(dòng)靜分離的數(shù)據(jù)并發(fā)加載策略

    摘要:關(guān)于動(dòng)靜分離的描述,這里推薦一篇不錯(cuò)的博文網(wǎng)站靜態(tài)化處理動(dòng)靜分離策略。這里的解決辦法則是采用的屬性,將其應(yīng)用于數(shù)據(jù)請(qǐng)求相關(guān)的上,就可以達(dá)到腳本與數(shù)據(jù)并發(fā)加載的效果。 作者:莫冠釗 轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接和作者信息 前言 當(dāng)今許多大型網(wǎng)頁應(yīng)用尤其是SPA均采用了動(dòng)靜分離的策略。關(guān)于動(dòng)靜分離的描述,這里推薦一篇不錯(cuò)的博文 網(wǎng)站靜態(tài)化處理—?jiǎng)屿o分離策略。 本人是做前端的,之前有幸與一...

    MrZONT 評(píng)論0 收藏0
  • webpack配置

    摘要:配置無入口的在輸出時(shí)的文件名稱。配置發(fā)布到線上資源的前綴,為類型。則是用于配置這個(gè)異步插入的標(biāo)簽的值。配置以何種方式導(dǎo)出庫。是字符串的枚舉類型,支持以下配置。在為時(shí),配置將沒有意義。是可選配置項(xiàng),類型需要是其中一個(gè)。 webpack配置 查看所有文檔頁面:全棧開發(fā),獲取更多信息。原文鏈接:第2章 配置,原文廣告模態(tài)框遮擋,閱讀體驗(yàn)不好,所以整理成本文,方便查找。 配置 Webpack...

    Doyle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<