如何删除客户端事件侦听器?
Posted
技术标签:
【中文标题】如何删除客户端事件侦听器?【英文标题】:How to remove a Client event listener? 【发布时间】:2022-01-18 18:50:03 【问题描述】:我有一个<Client>.on
函数,我想停止监听这个事件,例如:
bot.on('messageCreate', message =>
// some code
);
如何停止它并且不再接收此事件?
【问题讨论】:
【参考方案1】:我假设bot
是Client
的一个实例,它扩展了Node.js 的EventEmitter
。您可以使用on
监听事件(例如message
或ready
)并使用off
删除该监听器。 addListener
和 removeListener
也分别是 on
和 off
的别名。
将监听器函数存储在一个变量中,当您需要删除该监听器时使用bot.off(eventName, listener)
:
const listener = () =>
// your code here...
bot.on('event', listener)
// When you need to remove the listener:
bot.off('event', listener)
【讨论】:
这在开始时有效,但它导致了一些错误,导致我的机器人崩溃 @SciscorX 您能否编辑您的问题以包含错误? 如果您需要将信息传递给侦听器,您会怎么做?此外,假设您正在运行多个“客户端”实例(例如在两台服务器上运行的机器人)。事实上,侦听器将注册来自所有服务器的事件,而不仅仅是一个。因此,如果在服务器 A 上发生“事件”,它将在两个服务器中触发。您将如何管理将每个服务器的侦听器分开? @J.Day 我不太清楚你的意思。如果你想让某些东西只在特定的公会(服务器)上运行,你可以输入if (message.guild.id !== 'some ID') return
(例如)。在侦听器中的其余代码之前。如果您还有其他问题,请随时提出新问题。【参考方案2】:
您遇到了一个问题,我正在自己进行故障排除,尝试过滤每个服务器的事件,我终于弄明白了。 在这种情况下,我使用的是 bot 对象而不是客户端。但这就是您可以过滤每个服务器的单个事件的方式,只需添加到 if/else 语句中。我将只说明 channelCreate 的方法,但该概念适用于您可以收听的大多数事件。在文档中它指出通道类型是整数,但在我的调试中它显示为字符串。在 if 语句行,该方法通过检查创建通道所在的位置(创建它的公会)来工作,如果符合您的条件,则继续。
bot.on("channelCreate", (channel) =>
if(channel.guild.id == "######")
if(channel.type == 4 || channel.type == "category")
console.log(`Category Created: ID: $channel.id Name: $channel.name`)
else if(channel.type == 0 || channel.type == "text")
console.log(`Channel Created: ID: $channel.id Name: $channel.name`)
else if (channel.guild.id == "######")
//do other stuff
);
链接:
列出事件的 Discord 文档: https://discord.js.org/#/docs/main/stable/class/Client
一个很好的 github gist 来查看函数: https://gist.github.com/koad/316b265a91d933fd1b62dddfcc3ff584
频道类型: https://discord.js.org/#/docs/main/stable/typedef/ChannelType https://discord.com/developers/docs/resources/channel#channel-object-channel-types
【讨论】:
以上是关于如何删除客户端事件侦听器?的主要内容,如果未能解决你的问题,请参考以下文章
如何正确删除节点 js eventemitter 中的事件侦听器
如何删除 DocumentSnapshot 事件的侦听器(Google Cloud FireStore)
如何删除 Google OAuth2 gapi 事件监听器?