处理 Socket.io 事件的最佳实践?

SIS*_*SYN 1 javascript sockets events node.js dom-events

我正在从 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); }
    });
});
Run Code Online (Sandbox Code Playgroud)

在示例中,有一个chat message事件,但理想情况下还有许多其他事件我想实时推送给客户端,例如:

用户发送消息、用户开始/停止打字、用户喜欢帖子、用户邀请您成为朋友/群组成员等等。

我想实时捕获许多事件,但似乎必须有一种比在io.on()声明中塞满所有事件更好的方法。

我研究过 Node OOP,但不确定它是否一定会对这个应用程序有所帮​​助。

那么,如果我们有这些socket.on()语句,那么像我所描述的那样包含事件捕获的最佳实践是什么?

jfr*_*d00 5

我想实时捕获许多事件,但似乎必须有一种比在 io.on() 语句中塞满所有事件更好的方法。

没有。在里面io.on('connection', ...)有一个闭包,其中包含socket与新连接相关的变量。因此,您想要从该套接字响应的任何事件处理程序都会进入那里,或者在您从那里调用并将套接字传递给的某个函数中。这就是它的工作原理。

仅供参考,为了模块化,您不必将所有事件处理程序放在一个io.on('connection', ...). 如果将io对象导出到其他模块或在模块构造函数中将其传递给它们,则可以让其他模块创建自己的io.on('connection', ...)侦听器并在自己的io.on('connection', ...). io是一个 EventEmitter,因此它可以支持connection任意数量的事件侦听器,并且所有侦听器都会收到通知。