Socket.io上定义“on(message)”处理程序的最有效方法是什么?

7
Socket.io的示例都遵循这个模式。
io.sockets.on("connection", function(mySocket){
    mySocket.on("my message", function(myData){
        ...
    });
});

我觉得这会为每个连接创建一个新的回调函数。如果假设每个套接字都以相同的方式响应消息,那么定义一次处理程序以适用于所有套接字是否更加内存高效:

function myMessageHandler(data){
    ...
}

io.sockets.on("connection", function(mySocket){
    mySocket.on("my message", myMessageHandler);
});

甚至包括这个:

io.sockets.on("my message", function(mySocket, myData){
    ...
});

如果是这样,为什么Socket.io会推荐一种浪费内存的做法呢?我们是否希望在“connection”回调函数的闭包中保留与socket相关的有状态变量?

3
你正在进行一种不必要的担忧,被称为“过早优化”。如果开销差异决定了你的应用程序成败,那么选择node.js作为平台是错误的。我建议你不要这样做。 - ebohlman
我的应用程序逻辑通过数十个套接字消息执行,并提供数千个同时连接。如果每个连接复制数千行回调,那对我来说似乎是一个很大的优化疏忽。 - Jesse Hattabaugh
2个回答

0
从另一个角度来看,第一种形式易于阅读(因为省略了许多细节)。我认为这种形式最能说明库的工作原理。出于同样的原因,Node网站本身也使用了类似的风格。我认为这正是它在这些地方使用的原因。
阅读博客和讨论几分钟后,我发现开发人员通常选择传递命名函数。虽然我相信这样做有性能上的优势,但主要动机无疑是可读性。随着函数的增长,我认为你会发现第二种形式(或更详细的形式)更容易使用。

0

最高效的定义 Socket.io 的方式:

   io.on('connection', function (socket) {
   socket.on('new-message', function (data) {
       io.emit('emit-message', data)
        });
   });

或者

   io.on('connection', (socket) => {
   console.log('user connected');

   socket.on('disconnect', () => {
       console.log('user disconnected');
        });
   });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接