Ziy*_*iyu 23 javascript node.js node-modules
我有以下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;
Run Code Online (Sandbox Code Playgroud)
room.js
var User = require('./user.js');
var Room = function () {};
Room.prototype.test = function () {
return new User();
};
module.exports = Room;
Run Code Online (Sandbox Code Playgroud)
index.js
var User = require('./user.js');
var Room = require('./room.js');
var user = new User();
var room = new Room();
user.test();
room.test();
Run Code Online (Sandbox Code Playgroud)
index.js需要房间和用户.
这是问题所在.当我运行index.js时,我将从room.js中的'new User()'获取一个TypeError.似乎用户在index.js中隐藏了room.js中的User.
我做错了吗?是否允许这种要求?有任何想法吗?谢谢.
The*_*eme 24
查看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);
Run Code Online (Sandbox Code Playgroud)
另一种方法是仅在需要时才需要文件
// 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();
Run Code Online (Sandbox Code Playgroud)
像这样,您的出口是根据您需要的时间定义的.
但一般来说,如果你有循环依赖,你做错了,应该考虑你的架构.如果User需要创造新的Rooms和Room需要创造新的Users,似乎他们都有太多的责任.也许你会想要第三个组成部分是负责创建和传递正确的情况下,向Room和User,而不是让他们直接实例化的.
bal*_*ekt 12
我认为有更好的方法可以做到这一点.只需切换导出并要求如下:
user.js的
var User = function () {};
module.exports = User;
User.prototype.test = function () {
return new Room();
};
var Room = require('./room.js');
Run Code Online (Sandbox Code Playgroud)
room.js
var Room = function () {};
module.exports = Room;
Room.prototype.test = function () {
return new User();
};
var User = require('./user.js');
Run Code Online (Sandbox Code Playgroud)
index.js
var User = require('./user.js');
var Room = require('./room.js');
var user = new User();
var room = new Room();
user.test();
room.test();
Run Code Online (Sandbox Code Playgroud)
查看这篇文章:https://coderwall.com/p/myzvmg/circular-dependencies-in-node-js