我有以下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时,我将从room.js中的’new User()’中收到TypeError。似乎room.js中的User被index.js中的User隐藏了。
我做错什么了吗?这种要求被允许吗?有任何想法吗?谢谢。
查看http://nodejs.org/api/modules.html#modules_cycles,了解如何在node中进行处理。
您可以通过多种方式解决问题,例如将依赖项传递给实例(也称为 依赖项注入)
// 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,似乎他们都负有太多责任。可能您需要第三个组件,该组件负责创建正确的实例并将其传递给Roomand User,而不是让它们直接实例化它们。
User
Rooms
Room
Users