同步加载JS脚本

时间:2014-11-13 03:50:41

标签: javascript requirejs

我正在创建一个非常复杂的应用程序,并希望按需加载所有数十个JavaScript实体定义。我需要在使用前加载它们,并且必须确保它们在任何呼叫之前已经加载 看起来RequireJS是我需要的,但我仍然不知道如何在没有回调的情况下使用它。我想在使用它之前确保(或等待)JS库已经完全加载。是的,我知道

的语法
require([<js-file-name>], callback)

,但有没有办法实现同步加载而不是异步?并不总是可以使用回调。例如,如果你有一个循环用一个数组来填充需要加载不同js文件的项目,那么你的订单会有错误,因为加载不同的脚本会花费不同的时间。

1 个答案:

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