首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Node.js中处理循环依赖

如何在Node.js中处理循环依赖
EN

Stack Overflow用户
提问于 2012-06-03 17:42:21
回答 16查看 113.9K关注 0票数 193

我最近一直在使用nodejs,仍然在掌握模块系统,所以如果这是一个显而易见的问题,很抱歉。我想要大致如下所示的代码:

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

代码语言:javascript
复制
var ClassB = require("./b");

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

var a = new ClassA();

module.exports = a;

b.js

代码语言:javascript
复制
var a = require("./a");

var ClassB = function() {
}

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

module.exports = ClassB;

我的问题似乎是我不能从ClassB实例中访问ClassA实例。

有没有一种正确的/更好的方法来组织模块来实现我想要的?有没有更好的方法在模块之间共享变量?

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2012-06-04 02:49:14

虽然node.js确实允许循环require依赖,但您已经发现它可以是pretty messy,您最好将代码重组为不需要它。也许可以创建第三个类,它使用另外两个类来完成您需要的任务。

票数 104
EN

Stack Overflow用户

发布于 2012-06-04 02:54:03

尝试在module.exports上设置属性,而不是完全替换它。例如,a.js中的module.exports.instance = new ClassA()b.js中的module.exports.ClassB = ClassB。当您建立循环模块依赖关系时,请求模块将从所需模块获得对不完整module.exports的引用,您可以稍后添加其他属性,但当您设置整个module.exports时,您实际上创建了一个请求模块无法访问的新对象。

票数 195
EN

Stack Overflow用户

发布于 2014-01-22 00:51:11

EDIT it not 2015年,大多数库(即express)已经更新了更好的模式,因此循环依赖不再是必要的。我建议简单地不要使用它们。

我知道我在挖掘一个古老的答案...这里的问题是,module.exports是在您需要ClassB之后定义的。(JohnnyHK的链接显示)循环依赖在Node中工作得很好,它们只是同步定义的。如果使用得当,它们实际上解决了许多常见的节点问题(比如从其他文件访问express.js app )。

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

这将中断:

代码语言:javascript
复制
var ClassA = function(){};
var ClassB = require('classB'); //will require ClassA, which has no exports yet

module.exports = ClassA;

这将会起作用:

代码语言:javascript
复制
var ClassA = module.exports = function(){};
var ClassB = require('classB');

我一直使用这个模式来访问其他文件中的express.js app

代码语言:javascript
复制
var express = require('express');
var app = module.exports = express();
// load in other dependencies, which can now require this file and use app
票数 60
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10869276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档