Socket.io:接收多次触发事件

时间:2015-02-22 11:15:28

标签: javascript node.js sockets callback socket.io

我尝试使用以下代码实现简单锁定:

服务器:

socket.on('lock', function(ressInfo) 
{
  var lock = false;
  if(ressLocks.indexOf(ressInfo.id) === -1)
  {
    ressLocks.push(ressInfo.id);
    lock = true;
  }
  socket.emit("lock", lock);
});

客户端:

this.requestLock = function(ressInfo, callback)
{
  if(currentlyOnline)
  {
    socket.emit("lock", ressInfo);

    socket.on("lock", function(lock) 
    {
      // this gets triggered one additional time with each lock
      callback(lock);
    });
  }
  else
  {
    callback(true);
  }
}

在第一个电话中,我得到一个回拨true,在第二个电话上我得到两个回调false,第三个回叫三等等。

这里发生了什么?为什么多次调用socket.on

1 个答案:

答案 0 :(得分:0)

我可以想到两个原因:

客户方:

  • 如果您多次注册锁定功能

服务器端:

  • 正如我假设如果您多次注册以监听事件,假设您每次收到事件时都在运行socket.on函数

以下是你可以调试的方法。

安装node-debug

做node-debug" filename"

这将在调试模式下打开。现在检查socket.on锁定'的时间。正在注册。我有类似的问题。这是我如何解决它。

//check if msgtype is already binded    
if (!isMessageTypeBinded(msgType, someKey)) {
        // emit ot connection
        io.of(someKey).emit(msgType, message)
        return
    } else {
        // apply filter to all connection
        var sockets = io.of(someKey).sockets
        if (msgType) { // check for message tye
            activeMsgConn.push({
                "msgType": msgType,
                "accessKey": someKey
            })
            for (index in sockets) {
                var socket = sockets[index]
                socket.on(msgType, notifyNewMsg(socket))
                io.of(someKey).emit(msgType, message)
            }
        }
    }

到目前为止,我正在为一系列连接做好准备。

如果有新的msg,我首先检查msg是否已经绑定到套接字并且不添加任何新的命名空间。否则我循环遍历所有套接字连接并添加此处理程序。

在您的情况下,代码不必相同,但实现可能类似。