【问题标题】:Javascript: Is 'require' synchronous method in AMD (asynchronous module definition)?Javascript:AMD(异步模块定义)中是否“需要”同步方法?
【发布时间】:2012-09-29 16:46:54
【问题描述】:

AMD 中的“require”是否同步(异步模块定义)?如果是这样,是什么让这个规范异步?如果我在我的代码中间有 require() (它还没有被加载),它会停止执行吗?谈论浏览器端。

【问题讨论】:

    标签: javascript node.js module requirejs amd


    【解决方案1】:

    这里有两个不同的synchronous 概念。 第一个是“它会停止我的整个网页,然后坐下来等待文件。”。

    答案是否定的。如果你有一个带有依赖项的脚本,RequireJS 不会这样做。

    如果你使用得当,它会使用一个承诺系统。 这意味着,如果您发送回调并定义该文件的要求,则在加载所有必需的文件之前不会运行回调。

    如果在其中一个所需文件中存在 require,则在加载 ITS 依赖项之前不会运行 THAT 回调。

    最外层的回调(通常位于脚本底部的回调)不会运行,直到里面的所有内容都完成。

    这适用于承诺系统。 值得了解 Promise 系统是如何工作的(在某种程度上类似于观察者模式)。 它们旨在根据事件传递或链接,而不是让多个人按任何顺序收听。

    var widget = new Widget(),  
        widgetLoaded = widget.load(url); // return a promise to let the program use the widget
    
    widgetLoaded.then(function () { widget.move(35); })
                .then(function () { widget.setColour("Blue"); })
                .then(function () { widget.show(); });
    

    这就像返回 this 以便您可以链接函数调用,但调用实际上直到 widget.load() 完成后才会发生。

    widget 将实际控制何时发生这种情况,通过在小部件加载且一切正常时遵守其承诺,或者在出现问题时违反其承诺。

    在大多数 Promise 系统中,.then 或其他任何名称,要么采用两个函数(保留和损坏——在我的系统中,损坏始终是可选的),要么采用 successfailure 的对象-- $.ajax 执行此操作,然后让您预先确定在数据加载或失败时要如何处理数据 -- 承诺。

    因此您的页面仍然 100% 异步工作(不会中断 UI),但它是 100% 同步的,因为所有模块都将以正确的顺序触发。

    必须记住的一件事: 如果您的代码中有这些依赖项,那么您的脚本底部就不能有任何依赖项,等待运行,内联。 它们必须全部锁定在您的回调中,或者锁定在等待您的回调调用的函数中。

    这仅仅是因为它是一个异步进程,在实际处理方面,不会阻塞浏览器运行事件/JS、渲染页面等等等。

    【讨论】:

      【解决方案2】:

      对于requireJS

      您必须将一个 callback 方法与所需模块一起传递给.require(),当资源成功加载时该方法将被触发。所以,当然你应该/只能在回调中访问加载的 AMD 或 CommonJS 模块。

      对于 NodeJS:

      是的,.require() 确实同步工作。 NodeJS 使用 CommonJS 模块系统,而不是 AMD。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 1970-01-01
        • 2013-12-15
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多