1

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

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

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

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

4

1 回答 1

1

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

简短的总结是:不,这不起作用。有多种方法可以绕过它,但它从根本上不是 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,或者我也可以自动完成所有操作......

于 2012-10-25T21:56:04.377 回答