Discord.js Foreach循环添加/删除角色

Discord.js Foreach循环添加/删除角色,discord.js,Discord.js,我正在尝试创建一个简单的命令,该命令可以快速地将特定角色添加到所有服务器成员(或删除,具体取决于所使用的命令),但我遇到了一点问题 当前代码: try { message.guild.members.filter(m => !m.user.bot).forEach((member) => { member.removeRole(role) }); console.log(`Role ${role.name} taken from everyone!`)

我正在尝试创建一个简单的命令,该命令可以快速地将特定角色添加到所有服务器成员(或删除,具体取决于所使用的命令),但我遇到了一点问题

当前代码:

  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)
  }
这很有效,但我得到了很多。我指的是很多错误。主要是时间错误,例如超时:删除角色时出错

它一开始说监听器太多了,所以我上网查找这个; 但它什么都不做


任何帮助都将不胜感激!谢谢

您描述的所有行为都是因为Discord.js需要同时对同一个API端点进行大量调用,并且一次只能处理一定数量的调用。循环将遍历每个成员并一次又一次地调用您的方法,Discord.js最终将所有这些请求放入一个队列。当添加角色需要等待太长时间时,将返回您看到的错误。关于连接的侦听器太多以及可能出现的内存泄漏警告,Discord.js会在Discord表示该角色实际被删除时附加一个侦听器。因为您的代码不会等待每个成员的角色被删除,所以会同时附加很多内容

即使您想要调用
member.removole()
调用,它也不会在
forEach()
循环中工作,因为它的构建方式。它不会等待你的函数完成,所以它只是继续,然后继续。循环可以解决这个问题

在这种情况下,最好的解决方案实际上可能是克隆然后删除角色。通过删除它,它将自动从每个成员中删除,您不必对API进行所有调用或等待所有调用。要“克隆”它,您可以使用旧角色实例作为数据创建一个新角色,将1添加到该职位(假设旧角色存在)

另外,作为旁注,
try…catch
语句的
catch
块不使用回调函数。它内部的代码被读取和执行,就像在
try
块中一样(当然只有在出现错误时)。而且,如果您没有等待承诺,那么您的
catch
块实际上不会捕获拒绝,因为一切都可能已经开始了(承诺正在等待,所以它只是继续)