Javascript 如何使用socket.io在多个模块中定义侦听器
半年前,我用node.js和socket.io编写了一个小型多人游戏。现在我正在尝试改进它,我的改进之一是将代码分解成模块,顺便说一句,我使用的是expressjs 4.4和socket.io 1.0。我有一个玩家队列,处理连接玩家的顺序。一切都很顺利,直到我被socket卡住。io:我想处理玩家队列中的断开连接侦听器,同时我想将所有与游戏相关的侦听器放在我的游戏模块中。我尝试了几件事,包括,但没有一件是我带去工作的。当前我正在从以下位置传递io对象:Javascript 如何使用socket.io在多个模块中定义侦听器,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,半年前,我用node.js和socket.io编写了一个小型多人游戏。现在我正在尝试改进它,我的改进之一是将代码分解成模块,顺便说一句,我使用的是expressjs 4.4和socket.io 1.0。我有一个玩家队列,处理连接玩家的顺序。一切都很顺利,直到我被socket卡住。io:我想处理玩家队列中的断开连接侦听器,同时我想将所有与游戏相关的侦听器放在我的游戏模块中。我尝试了几件事,包括,但没有一件是我带去工作的。当前我正在从以下位置传递io对象: io = require("socket.
io = require("socket.io")(server);
我错过什么了吗
我的代码:
PlayerManager.js
为了完整性:
客户端的index.js
define(["socketio"], function(io) {
var socket = io("/player");
socket.on("blub", function() {
console.log("blub");
});
setInterval(function() {
socket.emit("blub");
}, 1000);
});
一年后,是时候清理和分享我在这段时间里获得的见解了
让socket.io相关的代码散布在整个项目中是一种糟糕的设计,或者是来自任何其他库的代码。如果必须更改包装器库,则必须在代码库的许多地方进行更改。更好的方法是将socket.io的使用限制在一个很薄的层上,在该层上完成与WebSocket之间的所有通信。从那以后,你将使用另一层信息:你自己的。Node.js自己的EventEmitter是完成这项工作所需的一切。与此同时,我会做一些不同的事情:将代码拆分为模块。您可能已经这样做了,但与其引用其他模块,不如通过消息传递(例如与EventEmitter)与它们通信。这会导致模块之间的低耦合。然后在socket.io-stuff周围写一个薄薄的包装。例如:将socket.io相关代码放入模块中。当你收到某物时。在“无论什么”上,fn;在socket.io处理程序的回调函数中,您将立即通过事件发射器将其转发到相应的模块。
var log = require("npmlog");
var config = require("./config");
var Duck = require("./Model/Duck").Duck;
var Game = (function() {
var self;
function Game(eventEmitter, io, players) {
log.info("Game", "loading ...");
self = this;
this.io = io;
this.eventEmitter = eventEmitter;
this.players = players;
setInterval(function() {
self.io.to("players").emit("blub");
});
// ...
return Game;
})();
exports = module.exports = Game;
define(["socketio"], function(io) {
var socket = io("/player");
socket.on("blub", function() {
console.log("blub");
});
setInterval(function() {
socket.emit("blub");
}, 1000);
});