【发布时间】:2012-09-29 16:46:54
【问题描述】:
AMD 中的“require”是否同步(异步模块定义)?如果是这样,是什么让这个规范异步?如果我在我的代码中间有 require() (它还没有被加载),它会停止执行吗?谈论浏览器端。
【问题讨论】:
标签: javascript node.js module requirejs amd
AMD 中的“require”是否同步(异步模块定义)?如果是这样,是什么让这个规范异步?如果我在我的代码中间有 require() (它还没有被加载),它会停止执行吗?谈论浏览器端。
【问题讨论】:
标签: javascript node.js module requirejs amd
这里有两个不同的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 或其他任何名称,要么采用两个函数(保留和损坏——在我的系统中,损坏始终是可选的),要么采用 success 和 failure 的对象-- $.ajax 执行此操作,然后让您预先确定在数据加载或失败时要如何处理数据 -- 承诺。
因此您的页面仍然 100% 异步工作(不会中断 UI),但它是 100% 同步的,因为所有模块都将以正确的顺序触发。
您必须记住的一件事: 如果您的代码中有这些依赖项,那么您的脚本底部就不能有任何依赖项,等待运行,内联。 它们必须全部锁定在您的回调中,或者锁定在等待您的回调调用的函数中。
这仅仅是因为它是一个异步进程,在实际处理方面,不会阻塞浏览器运行事件/JS、渲染页面等等等。
【讨论】:
对于requireJS:
您必须将一个 callback 方法与所需模块一起传递给.require(),当资源成功加载时该方法将被触发。所以,当然你应该/只能在回调中访问加载的 AMD 或 CommonJS 模块。
对于 NodeJS:
是的,.require() 确实同步工作。 NodeJS 使用 CommonJS 模块系统,而不是 AMD。
【讨论】: