我正在从ajax轮询切换到socket.io实时数据推送,但对管理事件的最佳实践有疑问。
我们说我有一个这样的基本服务器:
var Clients = [];
// Event fired every time a new client connects:
io.on('connection', function(socket) {
Clients.push(socket);
// What else should go in here?
// Individual functions for each event?
socket.on('chat message', function(msg){
console.log(':> '+msg);
io.emit('chat message', msg);
});
// When socket disconnects, remove it from the list:
socket.on('disconnect', function() {
var index = Clients.indexOf(socket);
if (index != -1) { Clients.splice(index, 1); }
});
});
在示例中有一个chat message
事件,但理想情况下我还有许多其他事件要实时推送给客户,例如:
用户发送消息,用户开始/停止输入,用户喜欢帖子,用户邀请您成为朋友/组成员,等等。
我想要实时捕捉很多事件,但似乎必须有更好的方法,而不是填写io.on()
语句中的所有内容。
我已经研究过Node OOP,但不确定它是否对这个应用程序有所帮助。
那么,如果我们有socket.on()
语句,那么包含事件捕获的最佳做法是什么呢?
答案 0 :(得分:4)
我想要实时捕获许多事件但是它 似乎必须有一个比填塞io.on()更好的方法 声明充满了他们。
不。在io.on('connection', ...)
内部,您有一个带有socket
变量的闭包,该变量与新连接有关。因此,您要从该套接字响应的任何事件处理程序都在那里或从您那里调用的一些函数中传递套接字。这就是它的工作原理。
仅供参考,为了模块化,您不必将所有事件处理程序放在一个io.on('connection', ...)
内。如果将io
对象导出到其他模块或在模块构造函数中将其传递给它们,则可以让其他模块创建自己的io.on('connection', ...)
侦听器,并在自己的{{1}中安装自己的事件处理程序。 }。 io.on('connection', ...)
是一个EventEmitter,因此它可以为io
事件支持尽可能多的侦听器,并且会通知所有人。