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]); }; 

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

 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 ); } 

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

 $.ajaxSetup({async: false}); $.getScript('library.js'); $.ajaxSetup({async: true}); 

简单的forms:

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

用法:

 getScript(a_url);