【问题标题】:socket.io sending N messages when joining room N timessocket.io 加入房间 N 次时发送 N 条消息
【发布时间】:2018-10-02 20:11:21
【问题描述】:

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

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')
  })
})

【问题讨论】:

    标签: javascript socket.io


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!!!就是这样!现在因为我离开房间时在教程中的任何地方都没有看到 removeAllListeners,你认为什么是更好的方法,因为我仍然想访问房间变量,我应该把事件处理程序放在哪里?还是我应该将它与 removeAllListeners 保持原样?
    • 除非您可以在连接时注册“newMessage”回调(例如,您知道所有房间),否则这可能是最好的方法。
    • 我也有同样的问题,但你的解决方案对我不起作用,当我使用 removeAllListeners 时,不再触发 on('joining-room')
    • 您是否将事件名称传递给removeAllListeners?如果不是,则可能会删除您不打算删除的侦听器。
    猜你喜欢
    • 2019-03-12
    • 2023-03-27
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2021-09-04
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多