除非我重命名require,否则同步形式的require会在解析循环依赖时抛出错误

时间:2014-04-24 14:03:34

标签: javascript coffeescript requirejs circular-dependency

我在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)。

1 个答案:

答案 0 :(得分:0)

我在这里做了一个测试,并找到了解决方案。你拥有的东西相当于这个JavaScript:

define(function (require) {

这足以使用require的(假)同步形式。但是,当您尝试使用同步require并且您具有循环依赖关系时,RequireJS将为您提供错误。你需要的是:

define(function (require, exports, module) {

这样你的模块就会使用exports来导出它的值,因此RequireJS有一个可以在模块完成初始化后更新的对象。