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



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

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

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

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

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

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

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

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或任何他们称之为它的东西,要么接受两个函数(保留和破坏 - 在我的系统中,brokens 总是可选的),要么它们接受一个带有successfailure的对象 -$.ajax这样做,然后让你在加载数据时预先确定你想要做什么, 或者如果失败了 - 承诺。

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

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

这仅仅是因为它是一个异步进程,就实际处理而言,并且不会阻止浏览器运行事件/JS、呈现页面等。

ForrequireJS

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

对于 NodeJS:

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

最新更新