【问题标题】:socket.emit() fires twice - socket.iosocket.emit() 触发两次 - socket.io
【发布时间】:2018-09-18 16:32:07
【问题描述】:

我正在创建一个一对一的聊天室。

这是我的基本算法:

  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”第一次被推入列表,第二次发现她已经存在于列表中,因此窗口仍然提醒“用户已经存在!”。

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

感谢您的帮助。

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    我可以修复代码,但我无法说出这个错误背后的原因。

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

    所以我在form.submit()下设置了一个变量var userExists=false

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

    socket.on('receiveRoomInfo')下,所有的代码实现都用if(!userExists)包围,这样可以保证socket.on('receiveRoomInfo')在一次表单提交下只执行一次。

    在我投票给自己的答案之前,我将等待几天以获得更好的想法。

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 2023-03-26
      • 2015-11-22
      • 2013-05-12
      • 2017-11-28
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多