【问题标题】:Most efficient way to define Socket.io on("message") handlers定义 Socket.io on("message") 处理程序的最有效方法
【发布时间】:2012-07-27 05:33:00
【问题描述】:

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 会推荐一种浪费内存的做法?我们是否希望在“连接”回调的闭包中保留套接字的状态变量?

【问题讨论】:

  • 您正在从事一种被称为“过早优化”的不必要的担忧。如果开销的差异决定了您的应用程序的成败,那么 node.js 是错误的平台选择。
  • 我的应用程序逻辑是在数十个套接字消息上执行的,并为数千个同时连接提供服务。如果每个连接都重复数千行回调,那对我来说似乎是一个很大的优化疏忽

标签: javascript node.js websocket socket.io


【解决方案1】:

换个角度看,第一种形式很容易阅读(因为省略了很多细节)。我认为这个表格最能说明图书馆是如何运作的。我相信,出于同样的原因,Node 网站本身也使用了类似的风格。我认为这正是它在那些地方使用的原因。

几分钟后阅读博客和讨论表明开发人员通常选择传递命名函数。尽管我确信它会带来性能提升,但主要动机无疑是可读性。我认为随着函数的增长,您会发现第二种形式(或更详尽的形式)更易于使用。

【讨论】:

    【解决方案2】:

    以最有效的方式定义 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');
            });
       });
    

    【讨论】:

      猜你喜欢
      • 2014-10-22
      • 1970-01-01
      • 2020-07-26
      • 2011-09-06
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多