【问题标题】:Mutually recursive AMD modules相互递归的 AMD 模块
【发布时间】:2012-10-24 22:39:28
【问题描述】:

我正在尝试使用 Javascript 和 jQuery 编写一个相当厚实的客户端 Web 应用程序。为了组织我的代码,我阅读了 Javascript 模块系统并决定使用 AMD 模块。目前我使用 curl.js 作为我的模块加载器,但我并不特别喜欢它。

不幸的是,我现在遇到了一个问题,即我的两个模块需要相互依赖。我原以为它可以正常工作 --- 但实际发生的是,加载应用程序似乎只是中途停止,一切都停止了,没有错误消息。

快速的 Google 显示几乎没有提及 AMD 和相互递归模块。我真的可以这样做吗?如果可以,怎么做? (我是否需要更改为不同的模块加载器?)

如果没有,对支持相互递归模块的替代模块系统有何建议?

【问题讨论】:

  • 如果只能自己走,不能放在同一个文件里吗?
  • 嗯,是的,但是使用模块的全部意义在于避免这样做...
  • 是的,但前提是你的代码是模块化的……如果这些东西相互依赖,你的模块加载器应该如何知道首先定义(执行)哪个模块?你会期待什么?
  • 我希望模块 A 获得一个引用模块 B 的未填充对象,然后它可以使用它来定义方法。然后在加载模块 B 时填写。显然,在 A 和 B 都加载之前,我实际上不能使用任何这些方法,但我至少应该能够定义方法。这是所有其他模块系统适用于类 JS 语言的方式...
  • 好的,我不知道有模块加载器将定义函数传递给定义方法的模块,我只有模块定义函数作为构造函数

标签: javascript js-amd


【解决方案1】:

所以在意识到“相互递归”的替代名称是“循环依赖”之后,我在网上找到了一些参考资料(特别是该主题的 require.js manual page)。

简短的总结是:不,这不起作用。有多种方法可以绕过它,但它从根本上不是 Just Work。

最简单的解决方法是使用显式同步require() 调用来中断依赖链:

define(
    ["require", "NotLoadedYet"],
    function (require, NLY)
    {
        // NLY is undefined here
        return {
            doSomething: function()
            {
                var realNLY = require("NotLoadedYet"); // fetch the real NLY on demand
                realNLY.doSomething(); // actuall call the method
            }
         };
    }
);

显然,这只有在您可以保证 NotLoadedYet 在您调用该方法时确实已加载时才有效。

已经进行动态后期绑定的语言中使用动态后期绑定的想法非常新,但它确实有效。叹。似乎有一种稍微少一点的 ew 技术,它涉及改为使用 requirejs 的 CommonJS 支持,但我不知道它是如何工作的,所以我坚持这样做。

我实际上要做的是实现一个包含实现的 NotLoadedYetImpl 模块和一个通过上述机制代理的 NotLoadedYet 模块。遗憾的是 Javascript 没有对对象的所有属性执行 getter 和 setter,或者我也可以自动完成所有操作...

【讨论】:

  • 感谢您发布答案 - 有一个类似的问题让我发疯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多