8

我目前被困在使用必须以非常特定的顺序加载的几个 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]);
};
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 回答