Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相互引用的RequireJS模块_Requirejs - Fatal编程技术网

相互引用的RequireJS模块

相互引用的RequireJS模块,requirejs,Requirejs,我使用requirejs加载一个web应用程序Im构建的几个模块,但我很难理解一些东西。我的主模块需要依赖于it,但其他定义的模块都以某种方式相互引用。因此,假设“project/func”模块可以调用“project/save”模块中的save函数。现在我的大部分代码都导致未定义的错误 通过在线阅读,也许我找到了所谓的循环参考??我不太确定。我想我需要知道我做错了什么,我应该怎么做。我试着在下面举一个例子,主文件在其中一个模块中调用bootstrap方法,但该模块在某个时候调用了另一个模块。这

我使用requirejs加载一个web应用程序Im构建的几个模块,但我很难理解一些东西。我的主模块需要依赖于it,但其他定义的模块都以某种方式相互引用。因此,假设“project/func”模块可以调用“project/save”模块中的save函数。现在我的大部分代码都导致未定义的错误

通过在线阅读,也许我找到了所谓的循环参考??我不太确定。我想我需要知道我做错了什么,我应该怎么做。我试着在下面举一个例子,主文件在其中一个模块中调用bootstrap方法,但该模块在某个时候调用了另一个模块。这只是一个小例子。真正的应用程序有更多的模块,如果有意义的话,它们都需要在彼此内部运行功能

//main require
require(['jquery', 'jqueryui', 'project/save', 'project/funcs', 'project/spec'], function($, ui, proSave, proFunc, proSpec){
    proFunc.bootstrap();     
});

//project/save
define(function(){
    var save = function(){
        //do some save stuff here
    }
    return {
        save: save
    }
});

//project/funcs
define(['project/save'], function(proSave){
    var funcs = {
        bootstrap: function(){
            //do some stuff 
            funcs.func1();
        },
        func1: function(){
        //do some stuff and save
        proSave.save();
    }
    }
    return {
        funcs: funcs
    }
});
RequireJS有一个循环依赖项,解释了如何处理它们:

如果您定义了一个循环依赖项(a需要b,b需要a),那么在这种情况下,当调用b的模块函数时,它将获得a的未定义值。b可以在稍后使用require()方法定义模块后获取a(请确保将require指定为依赖项,以便使用正确的上下文查找a):

因此,您必须编写代码,以便能够处理循环依赖项中的模块定义最初是未定义的这一事实。如何实现这一点的细节取决于应用程序的特定结构

这些来自RequireJS文档的智慧之言非常值得注意:

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


[重点补充]通常,如果模块A依赖于B而B依赖于A,则需要从A或B中提取功能子集,并将其移动到模块C中,从而允许A依赖于C而不是B,B依赖于C而不是A,并打破循环依赖关系。为了所有使用这种代码的人,这是最好的选择。然后,在少数情况下无法删除循环,我上面引用的文档会告诉您如何处理循环。

您能指出循环在问题中显示的代码中的位置吗?因为现在我没有看到。也许更好更简单的解释是,我有一个带函数a和B的模块,还有一个带函数C的模块。函数a调用函数C,但C需要调用函数B。YY下面的答案确实有帮助,我要试着看看我从哪里得到答案谢谢!OP可能不接受这个答案,但它确实帮助了我。:-)我刚接触过requirejs/amdjs,不知道如何引用其他模块。然后我找到了你的答案,意识到这和AngularJS的继承方式非常相似。
//Inside b.js:
  define(["require", "a"],
    function(require, a) {
        //"a" in this case will be null if a also asked for b,
        //a circular dependency.
        return function(title) {
            return require("a").doSomething();
        }
    }
  );