我在require中有一个奇怪的行为,我不知道如何避免(或者我的基础错误?)。
请考虑以下代码:
define (require) ->
potoo = require "potoo"
service = require "communication.data"
downloadIfNeeded = ->
# ...
service.download()
new potoo.App
pageContainer: potoo.UI.NGStylePage
userRequired: true
stdRoute: "overview"
onLogin: downloadIfNeeded
这不起作用,因为'communication.data'本身需要'app'(显示的代码)。所以我们显然有一个循环依赖。失败时出现'未捕获错误:模块名称'应用程序“尚未加载上下文:_'
由于在用户实际点击某些内容之前没有调用downloadIfNeeded函数,我认为,以下内容应该有效:
define (require) ->
potoo = require "potoo"
downloadIfNeeded = ->
service = require "communication.data"
service.download()
...
但实际上会抛出与上面相同的错误。为了使它工作,我必须使用一点点黑客。我将require函数替换为其他名称:
define (require) ->
potoo = require "potoo"
reqs = require
downloadIfNeeded = ->
service = reqs "communication.data"
service.download()
...
这是最好的方法吗?或者你会推荐requirejs也支持的CommonJS Style(module.export)。
答案 0 :(得分:0)
我在这里做了一个测试,并找到了解决方案。你拥有的东西相当于这个JavaScript:
define(function (require) {
这足以使用require
的(假)同步形式。但是,当您尝试使用同步require
并且您具有循环依赖关系时,RequireJS将为您提供错误。你需要的是:
define(function (require, exports, module) {
这样你的模块就会使用exports
来导出它的值,因此RequireJS有一个可以在模块完成初始化后更新的对象。