socket.io 1.2.1 如何在重新连接后修复双重事件

8

在socket.io的博客中,它说在1.2.1版本中:

"README修复,以防止重新连接时示例中出现双重事件[@nkzawa]"

我下载了客户端和服务器的1.2.1版本,但在重新连接后,它仍然调用事件两次。还是我应该在readme文件中做些什么?

我尝试了这种方式进行重新连接,并且它可以工作,但是我能在生产中使用吗?这是正确的方式吗?

socket.disconnect()
// remove socket object
socket = undefined
// connect again
socket = io.connect({'forceNew':true})

我听到的是这种方法正确吗?还是有缺点?

更新,添加代码

服务器端代码

socket.on('client_emited', function(data){
    socketIO.to('this socket id').emit('server_emitted');
})

客户端代码
var socket;
function connectSocket () {
   if (!socket)
     socket = io({'forceNew':true});
   else
     socket.connect();
}
socket.on('connect', function(){
   console.log('CONNECTED TO SOCKET.IO SERVER. SENDING "client_emited" EVENT');
   socket.emit('client_emited');
});
socket.on('server_emited', function(){
   console.log('RECEIVED "server_emited" EVENT');
});
socket.connect(); // here console shows 'CONNECTED TO SOCK...' and 'RECEIVED "server_e...' 1 time
socket.disconnect();
socket.connect(); // here console shows 'CONNECTED TO SOCK...' 2 times and 'RECEIVED "server_e...' 4 times time

服务器收到两次"client_emit"事件。


问题可能出在创建消息事件处理程序的代码中。您需要确保只调用该代码一次,或者在启动新的事件处理程序之前删除旧的事件处理程序。请向我们展示那段代码。 - jfriend00
谢谢回复,一会儿会展示。 - onar
先生,我正在修改代码以使其更易理解,大约需要2-3分钟。您能否就第二种方法写下您的意见:首先断开连接,删除套接字对象,然后重新连接。我可以使用它吗? - onar
我对第二种方法没有意见(从未尝试过)。它似乎是一种权宜之计,可能会产生其他后果,我更希望你能解决真正的问题。 - jfriend00
先生,感谢您的等待,我已经添加了我的代码。 - onar
jfriend00,我找到了解决方案。但是还是谢谢你的回复。 - onar
1个回答

10

解决方案是:

socket.on('connect', function(){....});

改为

socket.once('connect', function(){....});

了解更多信息,请阅读github上的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接