我正在尝试创建一个简单的命令,以快速向所有服务器成员添加特定角色(或删除,具体取决于所使用的命令),但是我遇到了一个问题。
当前代码:
try {
message.guild.members.filter(m => !m.user.bot).forEach((member) => {
member.removeRole(role)
});
console.log(`Role ${role.name} taken from everyone!`)
} catch {
error => console.log(error)
}
这行得通,但我有很多。我的意思是很多错误。主要是时间错误,例如超时:错误移除角色。
它说一开始听众太多,所以我上网查找了这个.setMaxListeners(0);。 但是它什么也没做
任何帮助将不胜感激!谢谢
答案 0 :(得分:1)
您描述的所有行为是因为Discord.js需要同时对同一个API端点进行如此多次的调用,并且一次只能处理一定数量。循环遍历每个成员,一次又一次地调用您的方法,Discord.js结束时将所有这些请求放入队列。如果必须等待太长时间才能添加角色,则会返回您看到的错误。关于附加的侦听器过多以及可能的内存泄漏警告,Discord.js会在侦听器说该角色实际上已删除时附加一个侦听器。由于您的代码不是等待每个成员的角色都被删除,因此会立即附加很多内容。
即使您想await
member.removeRole()
调用,由于其构建方式,它也无法在forEach()
循环中工作。它不会等待您的功能完成,因此它会一直运行然后继续前进。 for...of
循环将解决此问题。
在这种情况下,最好的解决方案实际上是克隆然后删除角色。通过删除它,它会自动从每个成员中删除,您不必对API进行所有这些调用或等待所有这些。要“克隆”它,您可以使用旧角色实例作为数据来创建新角色,并在位置上加1(假设存在旧角色)。
此外,就像一个旁注一样,catch
语句的try...catch
块不使用回调函数。就像try
块中一样,读取和执行其中的代码(当然,只有在出现错误的情况下)。而且,如果您没有await
兑现诺言,那么您的catch
区块实际上不会捕获拒绝,因为一切可能已经进行了(诺言尚未兑现,所以它只是继续)。