如何删除客户端事件侦听器?

Posted

技术标签:

【中文标题】如何删除客户端事件侦听器?【英文标题】:How to remove a Client event listener? 【发布时间】:2022-01-18 18:50:03 【问题描述】:

我有一个<Client>.on 函数,我想停止监听这个事件,例如:

bot.on('messageCreate', message => 
  // some code
);

如何停止它并且不再接收此事件?

【问题讨论】:

【参考方案1】:

我假设botClient 的一个实例,它扩展了Node.js 的EventEmitter。您可以使用on 监听事件(例如messageready)并使用off 删除该监听器。 addListenerremoveListener 也分别是 onoff 的别名。

将监听器函数存储在一个变量中,当您需要删除该监听器时使用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)

flash AS3 如何删除舞台事件侦听器

如何删除 Google OAuth2 gapi 事件监听器?

如何使用 .bind(this) 删除对象的事件侦听器? [复制]

如何在事件发生之前删除监听器?