如何使用 discord.js 更快地获取多个用户的用户名 discord

How to make discord fetch faster for usernames for multiple users with discord.js

提问人:user874737 提问时间:10/31/2023 更新时间:10/31/2023 访问量:40

问:

这是我的代码:

const memberGroup = ["801555002664419350", "801555002664419351", "801555002664419352", "801555002664419353", "801555002664419354", "801555002664419355", "801555002664419356", "801555002664419357", "801555002664419358", "801555002664419359", "801555002664419360", "801555002664419361", "801555002664419362", "801555002664419363", "801555002664419364"];
let namesArr = [];
for (i=0; i < queryLength2; i++) {
      namesArr .push(await message.guild.members.fetch({ user: memberGroup[i] }).catch((err) => { }));
 }
console.log(namesArr);

我正在使用 for 循环通过 api 从数组中获取成员。但是,这需要 7-9 秒才能返回 memberGroup 数组中 15 个 id 的结果。使用 30 个 id 执行此操作会使加载时间增加一倍,最多 16 秒。花费时间过长的原因可能是 memberGroup 数组上 90% 的用户不再是服务器的成员(离开服务器),因此他们返回 undefined。

有没有办法让它更快?我的计划是在列表/排行榜上列出 30 个用户,并使用 .user.username 显示他们的用户名。该列表仍应显示不再属于服务器的用户。然后,将提取为非成员返回的未定义值替换为稍后仅返回的 ID。

注意:我不喜欢在<@ID>中使用标签。

列表/排行榜应如下所示:

排行榜:

  1. 801555002664419350
  2. 马克
  3. 801555002664419353
  4. 801555002664419354
javascript 节点 .js 数组 不和谐.js

评论


答:

2赞 Nicolas 10/31/2023 #1

目前,您的循环正在等待每个 promise 解析,然后再转到下一个用户名。您可以使用 加快代码速度。await Promise.all(...)

Promise.all 函数接受一组 promise 并同时运行所有 promise。它将等待所有这些完成,然后再继续代码。

为此,您可以将每个 promise 推送到一个数组中,而无需调用它们。await

然后,你可以通过传递函数,通过传递它们,你刚刚构建的数组。awaitPromise.all

该函数的输出也将是一个数组,按照它们在 promise 数组中的顺序包含每个 promise 响应。

const memberGroup = [/* ... */];
let namesArrPromises = [];

for (i=0; i < queryLength2; i++) {
      namesArrPromises.push(message.guild.members.fetch({ user: memberGroup[i] }).catch((err) => { }));
 }

const namesArr = await Promise.all(namesArrPromises);

console.log(namesArr);

顺便说一句,应避免与 .如果要捕获错误,则应使用then().catch()awaittry {} catch {}

const memberGroup = [/* ... */];
let namesArrPromises = [];

for (i=0; i < queryLength2; i++) {
      namesArrPromises.push(message.guild.members.fetch({ user: memberGroup[i] }));
 }

try {
    const namesArr = await Promise.all(namesArrPromises);
} catch (err) {
    /* do something with the error */
}

console.log(namesArr);

评论

0赞 Wazner 10/31/2023
尝试/捕获不应该在附近吗?我不认为fetch会抛出,因为它在Promise中运行。await Promise.all
1赞 Nicolas 10/31/2023
你是对的,我的错。我会编辑我的答案。
0赞 user874737 11/1/2023
@Nicolas,它会抛出“未知成员”错误。该数组包含不属于服务器的用户的不和谐 ID。对于这样的情况,我该如何通过Promise.all来解决这个问题?该列表仍应显示不再属于服务器的用户,就像我在问题的最后一部分提供的示例一样。
1赞 Nicolas 11/1/2023
您可以使用 try catch 将该部分包装在异步函数中,并在 catch 子句中不执行任何操作。message.guild.members.fetch({ user: memberGroup[i] })