当前位置: 首页 > 知识库问答 >
问题:

如何处理Node.js中的循环依赖关系

茹轩昂
2023-03-14

我最近一直在使用nodejs,并且仍然在掌握模块系统,所以如果这是一个明显的问题,请原谅。我想要大致如下的代码:

a.js(主文件与节点一起运行)

var ClassB = require("./b");

var ClassA = function() {
    this.thing = new ClassB();
    this.property = 5;
}

var a = new ClassA();

module.exports = a;

b.js

var a = require("./a");

var ClassB = function() {
}

ClassB.prototype.doSomethingLater() {
    util.log(a.property);
}

module.exports = ClassB;

我的问题似乎是我无法从ClassB的实例中访问ClassA的实例。

有没有正确/更好的方法来构建模块以实现我想要的?有没有更好的方法在模块之间共享变量?

共有3个答案

南门星河
2023-03-14

[编辑]现在不是2015年,大多数库(即Express)已经使用更好的模式进行了更新,因此不再需要循环依赖项。我建议不要使用它们。

只需确保在需要具有循环依赖关系的文件之前定义了必要的导出。

这将打破:

var ClassA = function(){};
var ClassB = require('classB'); //will require ClassA, which has no exports yet

module.exports = ClassA;

这将工作:

var ClassA = module.exports = function(){};
var ClassB = require('classB');

我一直使用此模式来访问其他文件中的express.js应用程序

var express = require('express');
var app = module.exports = express();
// load in other dependencies, which can now require this file and use app
慕河
2023-03-14

虽然node.js确实允许循环的< code>require依赖,但是您已经发现它可能会非常混乱,您可能最好重新构造您的代码以不需要它。也许可以创建第三个类,使用另外两个类来完成您需要的任务。

叶鸿
2023-03-14

尝试在<code>模块上设置属性。导出,而不是完全替换它。E、 例如,<code>module.exports。instance=new ClassA()在<code>a中。js,module.exports。ClassB=ClassB在<code>b.js,您可以在后一个模块上添加其他属性,但需要设置整个<code>模块。导出,您实际上创建了一个新对象,所需模块无法访问该对象

 类似资料:
  • 问题内容: 我最近一直在使用nodejs,并且仍然要处理模块系统,因此很抱歉这是一个明显的问题。我想要大致如下的代码: a.js (主文件与节点一起运行) b.js 我的问题似乎是我无法从ClassB实例中访问ClassA实例。 有没有正确/更好的方法来构造模块来实现我想要的?是否有更好的方式在模块之间共享变量? 问题答案: 尽管node.js确实允许循环依赖,但正如您所发现的那样,它可能很杂乱,

  • 问题内容: 再次出现这种情况时,我到处乱跑,我快要疯了。 我希望Python首先会分析所有文件,以便它从一开始就知道所有标识符(我认为就像Java一样)。 我有一个“ main.py”和一个“ gui.py”。每个文件都包含一个类,该类使用另一个文件中的类。当我尝试运行“ main.py”时,解释器导入“ gui”,然后在“ gui.py”中导入“ main”,然后处理整个main模块,并说:“

  • 问题内容: 在我的系统中,我在浏览器中加载了许多“类”,在开发过程中,每个类都有单独的文件,并串联在一起进行生产。加载它们时,它们在全局对象(这里)上初始化一个属性,如以下示例所示: 我考虑使用James Burke的建议,而不是使用自己的全局对象,而是考虑使每个类都具有自己的AMD模块: 问题在于,以前在Employee和Company之间没有声明时间依赖关系:您可以按所需的顺序放置声明,但是现

  • a、b的变动都会调用ajax() 而且a变动的时候b也会发生变化,现在的问题是a变化的时候自己调用了一次ajax()并且引起了b变化,又触发了ajax()请问这种场景怎么处理?

  • 问题内容: 我试图用NodeJS编写代码,从外部API抓取数据,然后使用Mongoose在MongoDB中填充它们。在这之间,我将检查该特定对象是否已经存在于Mongo中。下面是我的代码。 我的问题是,由于NodeJS回调是并行的,因此不会按顺序调用它。我的最终结果将是这样的: 呼叫报告API console.log(长度)= 100 ^^^^^^^^^^^^^^^^^^^^^^^^^ conso

  • 我正在Java EE6平台上开发一个企业应用程序。IDE是NetBeans 7.2,应用服务器是GlassFish 3.1.2.2。 业务逻辑必须使用一个库(具体来说是HBase-RDF)来处理其核心中的一些任务。最初的HBase-RDF代码依赖于许多包,我相信GlassFish已经使用了它们的新版本。例如,我可以看到javax.xml、javax.activation、com.sun.jerse