Socket.io socket.off() 没有按预期工作

Posted

技术标签:

【中文标题】Socket.io socket.off() 没有按预期工作【英文标题】:Socket.io socket.off() not working as expected 【发布时间】:2020-05-24 03:51:29 【问题描述】:

我试图从套接字中删除所有事件侦听器到特定事件,并在 StackOveflow 上找到了这个 accepted answer。

我遵循了答案,并尝试了以下操作:socket.off('listenerName') to remove all listeners from the listenerName event,但是这段代码给了我一个错误:

(node:27706) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "listener" argument must be of type Function. Received type undefined

我正在使用socket.io 的最新版本 (2.3.0)。所以看起来,socket.off() 方法至少需要 2 个参数才能工作,我必须明确告诉它我要删除哪个函数。我尝试搜索socket.io的文档以找到该函数的定义,但我发现socket继承了Emiter的所有方法,包括off()方法。

有谁知道socket.io 中是否有一个函数,我可以使用它从特定事件中删除所有侦听器,而无需明确提供对最初添加函数的引用?

【问题讨论】:

我不知道您是如何从引用 socket.off('event_name')socket.off('event_name', listener) 到您的代码 socket.off('listenerName') 的答案中得到的。尝试更仔细地阅读。 我认为你所说的只是一个命名问题,在下面一行中,你会怎么称呼event_namesocket.on('disconnect', function() ); ?因为我会调用listenerName 断开连接字符串。通过使用 socket.io 2.3.0 执行socket.off('disconnect'),我得到了上述错误。因此,如果我弄错了,并且event_name 与我称之为listenerName 的不同,请原谅我,我会更正我的答案。但如果不是,也许你应该在投票和评论之前更仔细地阅读。 【参考方案1】:

我在另一个question找到了解决方案。

我已经设法从特定事件中删除了所有事件侦听器:

socket.removeAllListeners("news");

【讨论】:

以上是关于Socket.io socket.off() 没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

多个侦听器和 removeListener 删除所有内容 Socket.io

io.sockets.socket(socket_id).emit() - 没有方法'socket'

Node.js socket.io 没有响应 iOS socket.io 发出请求

Socket.io 房间没有收到消息

socket.io:没有触发断开事件

没有使用这个基本的 socket.io + redis 设置接收事件?