在socket.io中这是合法的吗?

时间:2016-05-17 12:19:21

标签: node.js sockets express socket.io

这是我的功能:

io.on('connection', function (socket) {
            socket.on('checkcrn', function (msg) {
                socket.on('error', function(err){
                  console.log("err + " + err);
                })
                console.log("message " + msg);
            });
        });

我要做的是调用相同的套接字但在另一个事件上的不同事件。这甚至可能还是我做错了什么?

2 个答案:

答案 0 :(得分:1)

这是一个模仿代码的独立版本:

const EventEmitter = require('events').EventEmitter;

let socket = new EventEmitter();

socket.on('checkcrn', function (msg) {
  socket.on('error', function(err){
    console.log("err + " + err);
  })
  console.log("message " + msg);
});

socket.emit('checkcrn', 'hello world #1');
socket.emit('checkcrn', 'hello world #2');
socket.emit('error', 'error #1');

如果你运行它,你会看到err + error #1被记录两次。更糟糕的是:如果您发送更多checkcrn条消息,则您发送的每条checkcrn消息都会收到额外的错误消息。这是因为您为每条error消息添加了一个新的checkcrn侦听器。

您可以通过将error侦听器的声明移动到与checkcrn侦听器相同的级别来解决该问题:

io.on('connection', function (socket) {

  socket.on('checkcrn', function (msg) {
    console.log("message " + msg);
  });

  socket.on('error', function(err){
    console.log("err + " + err);
  });

});

您将监听器附加到socket仍然是相同的。{/ p>

答案 1 :(得分:0)

这是一个很好的例子,可以证明内存泄漏。

通过在其他事件侦听器中分配事件侦听器,您可以在捕获的每个新事件上创建新的处理程序(稍后不删除它们),这非常糟糕。

让听众保持在同一水平,一切都会好的。

仅供参考:如果您不需要跟踪某些类型的事件,您可以通过执行socket.removeListener('eventname', functionReference)

简单地取消绑定此事件跟踪