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

标签 javascript node.js sockets events 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); }
    });
});

示例中有一个聊天消息事件,但理想情况下还有许多我想实时推送给客户端的其他事件,例如:

用户发送消息,用户开始/停止输入,用户喜欢一个帖子,用户邀请你成为 friend /群组成员,等等。

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

我研究了 Node OOP,但不确定它是否一定有助于此应用程序。

那么在我们有 socket.on() 语句的地方,像我描述的那样包含事件捕获的最佳实践是什么?

最佳答案

There are many events that I'd like to capture in real-time but it seems like there has to be a better way than cramming the io.on() statement full of them all.

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

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

关于javascript - 处理 Socket.io 事件的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41092082/

相关文章:

arrays - 在对象数组中查找所需元素的最佳方法

C++ 将 TCP 套接字转换为 BIO (OpenSSL)

javascript - Ruby on Rails : Difference of Authenticity Token being in Header or POST

javascript - 全页垂直幻灯片,如 apple.com/iphone-5c/

node.js - Auth0 - 范围不足

node.js - 从 NodeJS Express 'post' 可观察到的 ReactiveX

c# - .net 中的 java 的 ServerSocket

Python 无法使用套接字绑定(bind)我的外部/公共(public) IP 地址,出现错误但是当使用本地 IP 地址时,错误不会出现

javascript - 使用 javascript 停止页面重定向而不发出警告或询问

JavaScript 从常规 CSS 获取矩阵变换并将 matrix2D 转换为 matrix3D