AMD(异步模块定义)中的'require'是同步的吗?如果是这样,是什么让这个规范异步?如果我在代码中间有require()(并且尚未加载),它会停止执行吗?在浏览器方面说话。
答案 0 :(得分:2)
对于 requireJS :
您必须将回调方法与所需模块一起传递给.require()
,这会在资源成功加载时触发。所以,当然你应该/只能在回调中访问加载的AMD或CommonJS模块。
:
是的,.require()
可以同步工作。 NodeJS使用CommonJS模块系统,而不是AMD。
答案 1 :(得分:2)
这里有两个不同的synchronous
概念。
第一个是“它会停止我的整个网页,并等待文件。”
答案是否定的。如果你有一个带依赖关系的脚本,RequireJS不会这样做。
如果你恰当地使用它,它会使用一个promise系统。 这意味着如果您发送回调并定义对该文件的要求,则在加载所有必需文件之前不会运行回调。
如果其中一个必需文件中存在require,则在ITS依赖项加载之前, THAT 回调将不会运行。
最外层的回调(通常位于脚本底部的回调)在内部的所有内容都没有运行。
这适用于承诺系统。 值得了解承诺系统如何工作(在某种程度上类似于观察者模式)。 它们意味着根据事件传递或链接,而不是让多个人以任何顺序听。
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
实际上会控制何时发生这种情况,如果小部件加载并且一切正常,则保留其承诺,或者如果出现问题则通过违反承诺。
在大多数承诺系统中,.then
或他们称之为的任何系统,要么采用两个函数(保留和破坏 - 在我的系统中,代数总是可选的),或者它们使用success
的对象并且failure
- $.ajax
执行此操作,然后让您预先确定在加载数据时要对数据执行的操作,或者数据是否失败 - 承诺。
因此,您的页面仍可100%异步工作(不会中断UI),但它是100%同步的,因为所有模块都会以正确的顺序触发。
你 必须记住的一件事 : 如果您的代码中存在这些依赖项,则脚本底部不会有任何依赖项,等待运行,内联。 它们必须全部锁定在你的回调中,或者锁定在等待你的回调调用的函数内。
这只是因为 是 一个异步过程,就实际处理而言,并不会阻止浏览器运行事件/ JS,呈现页面等等。等等。