Javascript 同步加载JS脚本

Javascript 同步加载JS脚本,javascript,requirejs,Javascript,Requirejs,我正在创建一个相当复杂的应用程序,并希望根据需要加载我的数十个JavaScript实体定义。我需要在使用前加载它们,并且必须确保它们在任何调用之前加载。 看起来我需要的是RequireJS,但我仍然不知道如何在没有回调的情况下使用它。在使用JS库之前,我希望确保(或等待)它已完全加载。是的,我知道 require([<js-file-name>], callback) require([],回调) ,但有没有办法实现同步加载而不是异步加载?并不总是可以使用回调。例如,如果您有一个

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

require([<js-file-name>], callback)
require([],回调)

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

我认为正确的答案是将循环展开为递归函数。这样,您可以使用回调、承诺或任何您喜欢的异步机制,但仍然可以动态加载脚本(并且异步加载,相信我,这是您想要的)

Async肯定是有代价的,但想想另一种选择:当脚本加载时,UI线程会停止运行。这不是你或其他任何人想要的体验

在我所熟悉的所有语言中,C#是将异步引入现有代码模式的最简单方法,但一旦习惯了,JavaScript也不错。使用JQuery承诺来处理异步任务并不难。正如我所说的,您需要使用不同的代码模式,它们通常不像简单的循环那样简单,但是您通常可以找到一种不难做到的方法

编辑:如果您正确地编写了异步代码,通常不需要担心调用堆栈深度。只要确保每个递归调用都(以某种方式)挂起JQuery承诺,那么您的堆栈就会保持良好状态。大概是这样的:

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]);
}
函数执行任务(任务){
var i=0;
var executeTask=函数(任务){
$.getScript(task.script).done(函数(){
task.method();

如果(++i您的循环可以被重新编码,以便在异步加载时正常工作,因此这是一个错误的假设。在循环中使用异步操作只是一个正确设计的问题。@jfriend00您的意思是同步写入的所有内容都可以在异步中进行,没有开销和数以十亿计的嵌套回调吗?不,我的意思是有eXist是一个不错的设计,可以使用异步。你不必为了解决循环问题而将每个操作都转换为同步操作。你没有向我们展示你真正想要编写的代码,因此不可能在那里提出建议。相反,你来到这里是带着一个错误的假设,试图使所有内容同步很难适应这种错误的假设。编写好的、干净的、可维护的异步代码是需要学习和掌握的。它不像编写同步代码那么容易,但绝对值得学习和使用。@jfriend00好的,谢谢你的澄清。我在JS下编程不多,看起来真的需要学习设计接近。投票通过。所以说200项的调用堆栈对于JS引擎来说是正常的?而且非常有趣:为什么不同步实现require()这么好函数?我为什么要在这里使用异步?@LINQ2Vodka-浏览器中有这么多东西是异步的,原因是JavaScript正在浏览器的UI线程中运行。这意味着,如果线程暂停(例如,加载依赖项),浏览器本身会完全停止。这是一种可怕的体验,请浏览r制作者会因为你的劣质代码而受到指责。所以他们要求你异步做每件事。你会习惯的:这确实是一个好习惯。