Javascript:Is';要求';AMD(异步模块定义)中的同步方法?
AMD(异步模块定义)中的“require”是同步的吗?如果是这样的话,是什么使得这个规范是异步的?如果我在代码的中间有(和它还没有加载),它会停止执行吗?会说话的浏览器端。对于requireJS: 您必须将所需模块旁边的回调方法传递给Javascript:Is';要求';AMD(异步模块定义)中的同步方法?,javascript,node.js,module,requirejs,amd,Javascript,Node.js,Module,Requirejs,Amd,AMD(异步模块定义)中的“require”是同步的吗?如果是这样的话,是什么使得这个规范是异步的?如果我在代码的中间有(和它还没有加载),它会停止执行吗?会说话的浏览器端。对于requireJS: 您必须将所需模块旁边的回调方法传递给.require(),当成功加载资源时,将触发该回调方法。因此,您当然应该/只能访问该回调中加载的AMD或CommonJS模块 对于NodeJS: 是,.require()确实同步工作。NodeJS使用CommonJS模块系统,而不是AMD。这里有两种不同的同步概
.require()
,当成功加载资源时,将触发该回调方法。因此,您当然应该/只能访问该回调中加载的AMD或CommonJS模块
对于NodeJS:
是,
.require()
确实同步工作。NodeJS使用CommonJS模块系统,而不是AMD。这里有两种不同的同步概念。
第一个问题是“它会停止我的整个网页,然后坐下来等待文件。”
答案是否定的。如果您有一个带有依赖项的脚本,那么RequireJS不会这样做
如果你恰当地使用它,它就会使用承诺系统。
这意味着,如果您发送回调并定义对该文件的需求,那么在加载所有必需的文件之前,回调不会运行
如果其中一个所需文件中存在require,则在加载其依赖项之前,不会运行该回调
最外层的回调(通常位于脚本底部的回调)在内部的所有内容都完成之前不会运行
这在承诺体系中起作用。
有必要了解承诺系统是如何工作的(在某种程度上类似于观察者模式)。
它们是根据一个事件传递或链接的,而不是让多人按任何顺序收听
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
将实际控制何时发生这种情况,如果widget加载且一切正常,则遵守其承诺;如果出现问题,则违反其承诺
在大多数promise系统中,.then
或任何他们称之为它的东西,要么接受两个函数(保留和断开——在我的系统中,断开总是可选的),要么接受一个成功和失败的对象,然后,您可以预先确定在加载数据时,或者在数据失败时,您希望对数据执行什么操作
因此,您的页面仍然100%异步工作(不中断UI),但它是100%同步的,因为所有模块都将按正确的顺序启动
有一件事你必须记住:
如果代码中有这些依赖项,则不能在脚本底部有任何依赖项,这些依赖项等待内联运行。
它们必须全部锁定在回调内部,或者锁定在等待回调调用的函数内部
这仅仅是因为就实际处理而言,它是一个异步进程,不会阻止浏览器运行事件/JS、呈现页面等等