ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript ファイルを動的にロードしたときに順次実行する方法 (コードは次のとおり)

JavaScript ファイルを動的にロードしたときに順次実行する方法 (コードは次のとおり)

不言
リリース: 2019-01-15 10:08:12
転載
3478 人が閲覧しました

この記事の内容は、JavaScript ファイルを動的にロードしたときに順次実行する方法に関するものです (コードは次のとおりです)。必要な方は参考にしていただければ幸いです。 。

以前、js コードを書いていたときに、コードを通じて一定数の js ファイルを HTML に動的に挿入したいと思いました。ファイルの依存関係を大まかに整理します。

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);
});
ログイン後にコピー

しかし、コードの実行中に同じエラーが頻繁に報告されます。これはおそらく、実行中に b.js によって参照される a.js 内のメソッドが存在しないことを意味します。エラー率は非常に高くなりますが、100% エラーがないわけではありません。

解析の結果、その理由は次のとおりだと考えられます。配列に定義された順序でスクリプトタグを動的に作成し、対応するjsファイルをロードしますが、ファイルのサイズやネットワークなどの要因により、各ファイルの完了順序は、リクエストの順序と正確には一致しません。たとえば、上記の例では、a.js ファイルのサイズが大きく、b.js よりもダウンロードが遅い場合、b.js がダウンロードされて実行が開始されるときに、それが依存する a.js 内の変数またはメソッドは実行されません。到着します。

思いつく解決策は、前のファイルがロードされるのを待ってから次のファイルをロードすることです。おおよそのコードは次のとおりです。

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);
    });
}
ログイン後にコピー

上記のメソッドは次のように変更することもできます。チェーンされた Promise 呼び出しまたはコールバックのネストによって最終的に問題は解決されましたが、ファイルが非同期読み込みから同期読み込みに変更され、ファイルのダウンロード時間が増加するため、その影響はより顕著になります。したがって、ファイルを非同期にロードするのが正しい考え方ですが、ファイルを実行するときは、そのファイルが依存するファイルが最初にロードされて実行されるまで待つ必要があります。この問題については、require.js などのサードパーティ ライブラリから学ぶことができます。 、またはes6で導入されたモジュール 最適化機能はこれらの問題を完全に解決します。

以上がJavaScript ファイルを動的にロードしたときに順次実行する方法 (コードは次のとおり)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート