我有以下3个文件。
user.js需要room.js,room.js需要user.js。
user.js的
var Room = require('./room.js');
var User = function () {};
User.prototype.test = function () {
return new Room();
};
module.exports = User;
room.js
var User = require('./user.js');
var Room = function () {};
Room.prototype.test = function () {
return new User();
};
module.exports = Room;
index.js
var User = require('./user.js');
var Room = require('./room.js');
var user = new User();
var room = new Room();
user.test();
room.test();
index.js需要房间和用户。
这就是问题所在。当我运行index.js时,我将从' new User()'中获得一个TypeError。在room.js.似乎用户在index.js中隐藏了room.js中的用户。
我做错了吗?是否允许这种要求?有任何想法吗?感谢。
答案 0 :(得分:23)
查看http://nodejs.org/api/modules.html#modules_cycles有关如何在节点中处理此问题的方法。
您可以通过多种方式解决问题,例如将依赖项传递给实例,即依赖注入
// user.js
var User = function (Room) { this.Room = Room; };
User.prototype.test = function () {
return new this.Room();
};
module.exports = User;
// room.js
var Room = function (User) { this.User = User; };
Room.prototype.test = function () {
return new this.User();
};
module.exports = Room;
// index.js
var User = require('./user.js');
var Room = require('./room.js');
var user = new User(Room);
var room = new Room(User);
另一种方法是仅在您需要时才需要文件
// user.js
var User = function () {};
User.prototype.test = function () {
var Room = require('./room');
return new Room();
};
module.exports = User;
// room.js
var Room = function () {};
Room.prototype.test = function () {
var User = require('./user');
return new User();
};
module.exports = Room;
// index.js
var User = require('./user.js');
var Room = require('./room.js');
var user = new User();
var room = new Room();
像这样,您的出口是根据您需要的时间定义的。
但一般来说,如果你有循环依赖,你做错了什么,应该考虑你的架构。
如果User
需要创建新的Rooms
而Room
需要创建新的Users
,那么他们似乎都有太多的责任。
可能你需要第三个组件负责创建并将正确的实例传递给Room
和User
,而不是让它们直接实例化它们。
答案 1 :(得分:12)
我认为有更好的方法可以做到这一点。只需切换导出并要求如下:
user.js的
var User = function () {};
module.exports = User;
User.prototype.test = function () {
return new Room();
};
var Room = require('./room.js');
room.js
var Room = function () {};
module.exports = Room;
Room.prototype.test = function () {
return new User();
};
var User = require('./user.js');
index.js
var User = require('./user.js');
var Room = require('./room.js');
var user = new User();
var room = new Room();
user.test();
room.test();
查看此文章:https://coderwall.com/p/myzvmg/circular-dependencies-in-node-js
答案 2 :(得分:0)
两者之间的区别:
/* code above */
function a() {};
和
/* code above */
var a = function () {};
在第一个示例a
中将是{strong>函数在code above
中已经存在,但在第二个示例中不是。
了解到您可以使用以下简单解决方案:
// user.js
module.exports = User;
function User() {};
User.prototype.test = function () {
var Room = require('./room');
return new Room();
};
// room.js
module.exports = Room;
function Room() {};
Room.prototype.test = function () {
var User = require('./user');
return new User();
};
// index.js
var User = require('./user.js');
var Room = require('./room.js');
var user = new User(Room);
var room = new Room(User);