2

処理を高速化するために、私のWebアプリケーションは、jQueryのajax呼び出しを使用して、特定の機能のJavaScriptファイルをオンデマンドでロードします。ただし、競合状態の問題が発生しました。たとえば、ファイルB.jsはファイルA.jsに依存しています。list = [A.js、B.js]のようなリストを構成し、このリストを繰り返し処理して、スクリプトを非同期的に取得します。この競合状態を防ぐにはどうすればよいですか?

JavaScriptファイルをロードするコードは次のようなものです。

loadJS: function(url) {
    $.ajax({url: url, dataType: 'script', success: function(){}});
}
4

3 に答える 3

2

この種の依存関係管理は、信じられないほど難しいことではありません。それを適切に抽象化する方法にあまり踏み込むことなく、ロードするファイルの配列がある場合は、ajaxコールバック(jsファイルの内容を文字列にダウンロードしていると思います)で、ダウンロードするまで文字列を別の配列に保存しますすべてのファイルの内容。すべてのファイルがメモリに格納されたら、それらを順番にdomに追加します。

失敗の処理などを追加したいと思うかもしれませんが、それはそれを行う方法の一般的な概要です。

于 2013-03-13T19:29:40.753 に答える
0

以下を使用して、ファイル 1 と 2 を非同期的にロードするとします。

function load(URI) {
    $.ajax({
        url: URI,
        dataType: "script",
    });
}

ファイル 2 がファイル 1 に依存している場合、ファイルは次のように非同期的にロードできます。

load(url1)
  .then(load(url2));

ファイル 2 がファイル 1 に依存していない場合は、次のようにロードできます。

$.when(load(url1), load(url2))
    .then(function(e) { // both scripts loaded successfully});
于 2013-03-13T19:41:45.333 に答える
0

ajax 呼び出しを行う代わりに、スクリプト タグを追加するだけです。

var scripts = ['a.js', 'b.js'],
    idx;

for(idx in scripts) {
    if(scripts.hasOwnProperty(idx)) {
        document.write(['<script src="', scripts[idx], '"></script>'].join(''));
    }
}

スクリプトは非同期に読み込まれますが、追加した順序で同期的に実行されます。

于 2013-03-13T19:48:27.123 に答える