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

标签 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 被多次调用?

最佳答案

我可以想到两个原因:

客户端:

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

服务器端:

  • 我假设如果您多次注册来监听事件,并且假设每次收到事件时都运行 socket.on 函数,就会发生这种情况

以下是调试方法。

安装 Node 调试

执行 Node 调试“文件名”

这将以 Debug模式打开。现在检查“lock”的 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)
            }
        }
    }

我正在维护迄今为止建立的所有连接的数组。

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

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

关于javascript - Socket.io:接收事件触发多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28657175/

相关文章:

javascript - 仅限脉动文本 CSS3?

jquery - 使用 jQuery POST 时未保存 NodeJS Express session 变量

c++ - 如何在 boost asio 中设置阻塞套接字的超时时间?

c - ICMP header 和 IP header 校验和计算

Java ServerSocket 和 Android LocalServerSocket

javascript - 从集合中获取ElementsByTagName

javascript - 当我用完整的 url 链接脚本时,jQuery 脚本不工作

javascript - 在标记 Google Maps v3 上添加 onclick 事件

javascript - Javascript 异步回调背后的机制

node.js - WebStorm NPM 调试配置中的 `Connection refused`