Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:Is';要求';AMD(异步模块定义)中的同步方法?_Javascript_Node.js_Module_Requirejs_Amd - Fatal编程技术网

Javascript:Is';要求';AMD(异步模块定义)中的同步方法?

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。这里有两种不同的同步概

AMD(异步模块定义)中的“require”是同步的吗?如果是这样的话,是什么使得这个规范是异步的?如果我在代码的中间有(和它还没有加载),它会停止执行吗?会说话的浏览器端。

对于requireJS:

您必须将所需模块旁边的回调方法传递给
.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、呈现页面等等