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