javascript - socket.io 加入房间 N 次时发送 IN 消息

标签 javascript socket.io

当我加入房间并发送消息时,它只发送一次,但如果我离开房间并重新加入同一个房间,它会发送相同的消息两次。该消息会随着我离开/加入房间的次数而重复。我正在正确地离开房间,因为离开房间后我不再收到消息。

io.on('connect', socket => {
  console.log('New client connected')

  socket.on('removeRoom', room => {
    socket.leave(room)
    socket.to(room).emit(room + '-newMessage', 'user has left room')
  })

  socket.on('joinRoom', room => {
    socket.join(room)

    socket.on(room + '-newMessage', data => {
      io.sockets.in(room).emit('recieveMessage', data)
    })
  })

  socket.on('disconnect', () => {
    console.log('user disconnected')
  })
})

最佳答案

离开房间不会取消注册消息回调,它只是阻止回调被触发。当您重新加入房间时,会注册另一个回调,从而导致发送 N 条消息。

最简单的解决方案是删除“removeRoom”上的“newMessage”监听器。

socket.on('removeRoom', room => {
  socket.leave(room)
  socket.removeAllListeners(room + '-newMessage');
  socket.to(room).emit(room + '-newMessage', 'user has left room')
})

关于javascript - socket.io 加入房间 N 次时发送 IN 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52615706/

相关文章:

javascript - 向导提交按钮问题,我认为js中的这个表单向导问题

javascript - 为什么在 foreach 函数回调中对全局变量所做的更改不反射(reflect)取消回调

node.js - NodeJS + Cluster + Socket.IO 如何正确创建游戏房间?

node.js - 管理多个 TCP 套接字 nodejs

javascript - 第一次 Node 后 setInterval 无法正常工作

node.js - OpenShift 上的 Socket.io 和 Node

javascript - Vuex 语法错误与 localcomputed 函数结合 getter 和 setter

javascript - 在 React 中使用 async wait 进行 SessionStorage 调用

javascript - jQuery : a drag-and-drop upload with multi dropzone

node.js - socket.io websocket 回退