【问题标题】:Best practice for handling Socket.io events?处理 Socket.io 事件的最佳实践?
【发布时间】:2017-04-26 19:13:46
【问题描述】:

我正在从 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() 语句,那么像我描述的那样包含事件捕获的最佳做法是什么?

【问题讨论】:

    标签: javascript node.js sockets events dom-events


    【解决方案1】:

    我想实时捕捉许多事件,但它 似乎必须有比塞 io.on() 更好的方法 声明全部内容。

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

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

    【讨论】:

    • @DanL - 我添加了另一段关于模块化的另一个选项。
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多