Javascript 如何解决Require.js中的循环依赖关系?

Javascript 如何解决Require.js中的循环依赖关系?,javascript,requirejs,amd,circular-dependency,commonjs,Javascript,Requirejs,Amd,Circular Dependency,Commonjs,基本上,“子”模块创建一个对象,该对象应该是“主”模块实用程序库的一部分。但是,“sub”对象依赖于“main”中的实用程序: 我如何使用require.js实现这一点,而不创建一个吞噬整个地球的黑洞 非常感谢。中有几点建议: b可以在稍后使用require()方法定义模块后获取a(确保将require指定为依赖项,以便使用正确的上下文查找a) e、 g: 或 您可以改为使用exports为模块创建一个空对象,该对象可立即供其他模块参考 e、 g: 及 循环依赖性很少见,这通常是一个迹象,表明您

基本上,“子”模块创建一个对象,该对象应该是“主”模块实用程序库的一部分。但是,“sub”对象依赖于“main”中的实用程序:

我如何使用require.js实现这一点,而不创建一个吞噬整个地球的黑洞


非常感谢。

中有几点建议:

b
可以在稍后使用
require()
方法定义模块后获取
a
(确保将require指定为依赖项,以便使用正确的上下文查找
a

e、 g:

您可以改为使用
exports
为模块创建一个空对象,该对象可立即供其他模块参考

e、 g:

循环依赖性很少见,这通常是一个迹象,表明您可能需要重新考虑设计


“重新考虑设计”,我完全同意,但目前这有点紧。我已经调查过你的提议了。。。在过去的两天里,我一直在努力解决
exports
对象,现在你告诉我它马上就可以使用了?我认为只有在工厂功能恢复执行后,
导出
才会返回到
定义
/
要求
?再看一眼,你似乎在建议
main
应该只恢复执行一次
sub
恢复?如果你能真正列出这些事情发生的顺序,我将不胜感激。我想这就是我无法理解这种变通方法如何解决我的问题的地方。谢谢使用
导出
只允许每个模块引用某个对象,而不是每个模块的
未定义
。您不能立即使用这两个模块的函数,但可以确保在运行时正确设置引用。考虑并行运行的两个模块定义。他们都知道在哪里可以找到另一个模块,但在他们都完成之前,他们都无法进行交互。我理解,但我不知道这是如何解决的。因为
sub
模型明确依赖于
main
中的某些函数,但是
main
只需要从
sub
获取返回值。我想我将把它们都加载到一个父模块中,让那个模块组合起来,并将它们作为单个对象返回。谈论“重新思考设计”…:)当然,如果你想进一步阐述你的解决方案,我真的会洗耳恭听!你对solve的定义是什么?
导出
技术解决了循环相关模块返回
未定义
的问题。
require
技术解决了在定义时具有依赖项循环的问题。
// Main module
define(['sub'], function(sub) {
    var utils = {
        utilityMain: function () {
           // ...
        };
        // ...
    };

    tools.subModule = sub;

    return tools;
});

// Sub module
define(['main'], function(main) {
    return new (function () {

        // Singleton object using functions in main module
        var somestuff = function () {
            main.utilityMain();
            // etc
        };
    })();
});   
// Sub module
define(['require'], function(require) {
    return new (function () {

        // Singleton object using functions in main module
        var somestuff = function () {
            require('main').utilityMain();
            // etc
        };
    })();
});
// Main module
define(['sub', 'exports'], function(sub, exports) {
    exports.utilityMain: function () {
       // ...
    };

    exports.subModule = sub.sub;
});
// Sub module
define(['main', 'exports'], function(main, exports) {
    exports.sub = new (function () {

        // Singleton object using functions in main module
        var somestuff = function () {
            main.utilityMain();
            // etc
        };
    })();
});