jQuery getScript

Kri*_*ris 8 javascript jquery getscript

我目前正在使用几个必须以非常特定的顺序加载的JavaScript库.由于jQuery的getScript()是异步的,因此它可以非常快速地下载所有脚本,并在完成后执行它们.由于它们没有按顺序执行,因此我从库中获得了多个错误.

不幸的是,我无法更改或修改任何这些库.我试图做的是使用一种下载JavaScript库的方法,并在回调中让它调用自己,直到它完成加载所有库.

这适用于第一个文件.当第二个文件出现时,它会丢失回调内的上下文,我不能再调用我的递归方法了.

有任何想法吗?

代码的配对版本:

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]);
};
Run Code Online (Sandbox Code Playgroud)

Mic*_*rry 9

您可以执行同步调用,只需执行此操作:

$.ajaxSetup({async: false});
$.getScript('library.js');
$.ajaxSetup({async: true});
Run Code Online (Sandbox Code Playgroud)


she*_*sek 9

我不确定你的代码有什么问题,但是我会这样做:

function loadOrdered(files, callback) {
   $.getScript(files.shift(), function() {
       files.length
          ? loadOrdered(files, callback)
          : callback();
   });
}
Run Code Online (Sandbox Code Playgroud)

编辑,更好的版本:

function loadOrdered(files, callback) {
   $.getScript(files.shift(), files.length
       ? function(){loadOrdered(files, callback);}
       : callback
   );
}
Run Code Online (Sandbox Code Playgroud)

甚至更好,如果您不关心旧浏览器或实现Function.prototype.bind自己(也支持绑定参数,而不仅仅是this上下文):

function loadOrdered(files, callback) {
   $.getScript(files.shift(), files.length
       ? loadOrdered.bind(null, files, callback)
       : callback
   );
}
Run Code Online (Sandbox Code Playgroud)