javascript - 同步加载JS脚本

标签 javascript requirejs

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

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

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

最佳答案

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

异步肯定是有代价的,但请考虑替代方案:在加载脚本时,UI 线程会逐渐停止。这不是您或其他任何人想要的体验。

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

编辑:如果您正确编码了异步内容,则通常不需要担心调用堆栈深度。只要确保每个递归调用(以某种方式)卡在 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]);
}

关于javascript - 同步加载JS脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26901027/

相关文章:

AngularJS - 使用 RequireJS 或内置的东西进行模块化开发?

RequireJS 加载脚本文件,但传递的引用未定义

javascript - 如何从 chrome 扩展中的多个 HTML 文件访问 chrome 存储

javascript - jquery 打开带有动态 id 的 div

javascript - 你如何在 promise 或回调中运行 `yield next`?

javascript - 隐藏客户端 API 调用

javascript - r.js - 排除特定文件列表

java - 如何在java类中使用外部javascript函数

RequireJS - 优化多个文件并按需加载

javascript - 使用 RequireJS 和 Grunt 获取空白页面