我尝试使用以下代码实现简单锁定:
服务器:
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
?
答案 0 :(得分:0)
我可以想到两个原因:
客户方:
服务器端:
以下是你可以调试的方法。
安装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是否已经绑定到套接字并且不添加任何新的命名空间。否则我循环遍历所有套接字连接并添加此处理程序。
在您的情况下,代码不必相同,但实现可能类似。