我正在创建一个非常复杂的应用程序,并希望按需加载所有数十个JavaScript实体定义。我需要在使用前加载它们,并且必须确保它们在任何呼叫之前已经加载 看起来RequireJS是我需要的,但我仍然不知道如何在没有回调的情况下使用它。我想在使用它之前确保(或等待)JS库已经完全加载。是的,我知道
的语法require([<js-file-name>], callback)
,但有没有办法实现同步加载而不是异步?并不总是可以使用回调。例如,如果你有一个循环用一个数组来填充需要加载不同js文件的项目,那么你的订单会有错误,因为加载不同的脚本会花费不同的时间。
答案 0 :(得分:1)
我认为正确的答案是将循环展开为递归函数。这样你就可以使用你想要的回调或承诺或任何异步机制,但仍然动态加载脚本(并且异步地,相信我 - 你想要的)。
Async肯定是有代价的,但想想另一种选择:在你的脚本加载时,UI线程会停止运行。这不是你或任何其他人想要的经历。
在我熟悉的所有语言中,C#有最简单的方法将异步引入现有的代码模式,但是一旦你习惯了它,JavaScript就不错了。使用(比方说)JQuery承诺处理异步任务并不是那么困难。正如我所说,你需要使用不同的代码模式,它们通常不像简单的循环那样简单,但你通常可以找到一种方法来做到这一点并不是非常困难。
编辑:如果您正确编写异步内容,则通常不必担心调用堆栈深度。只需确保每个递归调用都以JQuery Promise挂起(以某种方式),并且您的堆栈将保持正常。像这样:
function executeTasks (tasks) {
var i = 0;
var executeTask = function (task) {
$.getScript(task.script).done(function () {
task.method();
if (++i <= tasks.length) {
executeTask(task[i]);
}
});
}
executeTask(tasks[i]);
}