8

私は現在、非常に特定の順序でロードしなければならないいくつかのJavaScriptライブラリを使用して立ち往生しています。jQueryのgetScript()は非同期であるため、すべてのスクリプトのダウンロードを非常に迅速に開始し、終了すると実行します。それらは順番に実行されないので、ライブラリから複数のエラーが発生します。

残念ながら、これらのライブラリを変更または変更することはできません。私がやろうとしているのは、JavaScriptライブラリをダウンロードするメソッドを使用し、コールバックで、すべてのライブラリのロードが完了するまでそれ自体を呼び出すようにすることです。

これは最初のファイルで機能します。2番目のファイルが発生すると、コールバック内のコンテキストが失われ、再帰メソッドを呼び出すことができなくなります。

何か案は?

コードのペアダウンバージョン:

function loadFiles (CompletedCallback) {
    var Files = getFiles(); // This is an array of js files to load
    var currentFileIndex = 0;

    function processFile (file) {
        $.getScript(file[currentFileIndex], $.proxy(function () {
            ++currentFileIndex;
            if (currentFileIndex === Files.length) {
                CompletedCallback();
            } else {
                processFile(Files[currentFileIndex]);
            }
        }, this);
    };

    processFile(Files[currentFileIndex]);
};
4

3 に答える 3

9

コードの何が問題になっているのかわかりませんが、次のようにします。

function loadOrdered(files, callback) {
   $.getScript(files.shift(), function() {
       files.length
          ? loadOrdered(files, callback)
          : callback();
   });
}

編集、より良いバージョン:

function loadOrdered(files, callback) {
   $.getScript(files.shift(), files.length
       ? function(){loadOrdered(files, callback);}
       : callback
   );
}

または、古いブラウザを気にしない場合や自分で実装する場合(コンテキストFunction.prototype.bindだけでなく、引数のバインドもサポートされている場合):this

function loadOrdered(files, callback) {
   $.getScript(files.shift(), files.length
       ? loadOrdered.bind(null, files, callback)
       : callback
   );
}
于 2011-08-16T19:06:32.140 に答える
9

同期呼び出しを行うには、次のようにします。

$.ajaxSetup({async: false});
$.getScript('library.js');
$.ajaxSetup({async: true});
于 2011-08-16T19:04:36.070 に答える
0

単純な形式:

function getScript(url){ $.ajax({url: url, type: 'post', async: false}); }

利用方法:

getScript(a_url);
于 2014-08-19T13:23:14.580 に答える