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

在AMD(asynchronous模块定义)中是否需要同步? 如果是这样,是什么使这个规范asynchronous? 如果我在代码中间要求()(还没有加载),它会停止执行吗? 在说浏览器端。

这里有两个不同的synchronous概念。 首先是“它会停止我的整个网页,并坐等文件”。

答案是不。 如果你有一个具有依赖关系的脚本,RequireJS不会这样做。

如果你恰当地使用它,它使用承诺系统。 这意味着,如果您发送callback并定义了该文件的需求,那么只有加载了所有必需的文件后,callback才会运行。

如果其中一个需要的文件存在需求,那么只有在加载了ITS依赖关系之后,才会运行该callback。

最外面的callback函数(通常是脚本底部的callback函数)不会运行,直到里面的所有内容都有效。

这在承诺系统上工作。 值得理解系统是如何工作的(类似于某种观察者模式)。 他们的目的是被传递或链接,基于一个事件,而不是让多人听任何顺序。

 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将实际控制何时发生这种情况,如果小部件加载并且一切正常,则保持其承诺,或者如果发生错误,则通过违反承诺。

在大多数承诺系统中,无论它们是什么,它们要么需要两个函数(保留和破坏 – 在我的系统中,brokens总是可选的),或者它们带有successfailure的对象 – $.ajax这样做,然后让您预先确定在加载数据时要对数据执行什么操作,或者是否失败 – 承诺。

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

有一件事你必须记住 :如果你的代码中有这些依赖关系,那么你的脚本底部就不能有任何依赖关系,等待内联运行。 它们必须全部被locking在你的callback中,或者locking在等待你的callback调用的函数中。

这只是因为它一个asynchronous进程,就实际处理而言,并不会阻止浏览器运行事件/ JS,渲染页面等等。

对于requireJS

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

对于NodeJS:

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