Javascript:AMD中的'require'同步方法(异步模块定义)?

时间:2012-09-29 16:46:55

标签: javascript node.js module requirejs amd

AMD(异步模块定义)中的'require'是同步的吗?如果是这样,是什么让这个规范异步?如果我在代码中间有require()(并且尚未加载),它会停止执行吗?在浏览器方面说话。

2 个答案:

答案 0 :(得分:2)

对于 requireJS

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

NodeJS的

是的,.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,呈现页面等等。等等。