socket.emit()触发两次-socket.io

时间:2018-09-18 07:42:04

标签: node.js socket.io

我正在建立一对一聊天室。

这是我的基本算法:

  1. 通过表单接受用户的输入(昵称)
  2. 从服务器获取所有现有的连接和房间
  3. 检查此昵称是否已存在:
    如果存在,则提交表单return false;如果不存在,......

现在我在第2步上遇到一个socket.emit()两次错误。

这是我的客户端代码:

$('#login').submit(function(e){
   socket.emit('getRoomInfo');
   socket.on('receiveRoomInfo',function(info){

      //Here has some code to fetch person_room list from server. 
      //e.g, person_room[nickname]= roomNO

      if(person_room[nickname]){
           alert('User already exists!');
      }else{
         //show chat
         //hide the form
         //update person_room list
         //do something
      }

   });
   return false;
});

这是我的服务器端代码:

socket.on('getRoomInfo',function(){
    socket.emit('receiveRoomInfo', {'person_room': person_room, 'roomNO': roomNO});
});

错误说明:

  1. 假设我打开一个表单(index.html),然后输入“ John Snow”,然后提交表单。一切正常,隐藏表单,显示聊天记录。等待中 另一个连接...
  2. 然后我打开另一个表单(index.html),然后输入“ John Snow”,然后提交表单。窗口警报“用户已存在!”。表单未提交。
  3. 我删除“ John Snow”并输入“ Arya Stark”,然后提交表格。窗口仍然警报 “用户已经存在!”,但是这次,表单被隐藏,聊天显示 上。

我测试的内容:

  • 登录表单仅提交一次
  • 在客户端,socket.emit('getRoomInfo')在错误描述3下被触发了两次,这意味着socket.on('receiveRoomInfo')也被触发了两次。 因此,发生的情况是,“ Arya Stark”第一次被推送到列表中,第二次发现她已经存在于列表中,因此窗口仍会警告“用户已经存在!”。 / strong>

我研究了很多类似的问题,但没有一个与这个问题相同。

感谢帮助。

1 个答案:

答案 0 :(得分:0)

我可以修复代码,但是我无法说出该错误的原因。

我发现在一次提交表单后,socket.on('receiveRoomInfo')被触发了两次。

因此,我在var userExists=false下设置了变量form.submit()

在检测到if(person_room[nickname])之后,设置userExists=true

socket.on('receiveRoomInfo')下,用if(!userExists)包围所有代码实现,以便我们可以确保socket.on('receiveRoomInfo')在一次表单提交后仅执行一次。

我将等待几天才能提出更好的主意,然后再投票决定自己的答案。