我正在尝试使用以下代码实现一个简单的锁:
服务器:
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/