相互递归的AMD模块

时间:2012-10-24 22:39:29

标签: javascript js-amd

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

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

一个快速的谷歌几乎没有提到AMD和相互递归的模块。我真的可以这样做,如果是这样,怎么样? (我是否需要更改为其他模块加载程序?)

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

1 个答案:

答案 0 :(得分:1)

因此,在意识到“相互递归”的替代名称是“循环依赖”之后,我在网上找到了一些引用(特别是关于该主题的require.js manual page)。

简短摘要是:不,这不起作用。有各种方法可以绕过它,但它从根本上说不仅仅是工作。

最简单的解决方法是使用显式同步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真的被加载时,这才有效。

已经的语言中使用动态后期绑定的想法是动态的后期绑定,但它确实有效。叹。似乎有一种略逊一筹的技术,涉及改为使用requirejs的CommonJS支持,但我不知道它是如何工作的,所以我坚持这一点。

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