You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用discord.js加速批量用户用户名的Discord获取速度

优化Discord成员获取速度的方案

问题根源

你当前的循环是串行执行请求——每次await都要等上一个请求完成才会发起下一个,15次请求的耗时就是单个请求时间的累加。加上90%的用户已离开服务器,每次失败的请求也会占用API响应时间,导致总耗时翻倍增长。

优化方案

1. 用并行请求替代串行循环

使用Promise.all同时发起所有成员获取请求,让所有请求并行执行,总耗时会接近单个请求的最长响应时间,而非所有请求时间的总和。

const memberGroup = ["801555002664419350", "801555002664419351", "..."]; // 你的ID数组

// 生成所有fetch请求的Promise数组
const fetchPromises = memberGroup.map(userId => 
  message.guild.members.fetch({ user: userId }).catch(() => undefined)
);

// 并行执行所有请求
const namesArr = await Promise.all(fetchPromises);

2. 一步到位生成排行榜数据

直接在请求阶段处理结果,成功时取用户名,失败时返回原ID,省去后续替换undefined的步骤:

const memberGroup = ["801555002664419350", "..."];

const fetchPromises = memberGroup.map(userId => 
  message.guild.members.fetch({ user: userId })
    .then(member => member.user.username)
    .catch(() => userId) // 请求失败直接返回ID
);

// 并行获取所有数据
const leaderboardData = await Promise.all(fetchPromises);

// 生成排行榜文本
const leaderboardText = `排行榜:\n${leaderboardData.map((item, idx) => `${idx + 1}. ${item}`).join('\n')}`;
console.log(leaderboardText);

3. 优先读取本地缓存

Discord.js会缓存已加载的成员,先检查缓存再决定是否发起API请求,减少不必要的网络开销:

const memberGroup = ["801555002664419350", "..."];

const fetchPromises = memberGroup.map(userId => {
  // 先从缓存中查找成员
  const cachedMember = message.guild.members.cache.get(userId);
  if (cachedMember) {
    return Promise.resolve(cachedMember.user.username);
  }
  // 缓存中没有再发起API请求
  return message.guild.members.fetch({ user: userId })
    .then(member => member.user.username)
    .catch(() => userId);
});

const leaderboardData = await Promise.all(fetchPromises);

优化效果

采用并行请求后,15个ID的处理耗时会压缩到1-2秒左右,30个ID的耗时也不会翻倍,基本和单个请求的最长响应时间持平。

内容的提问来源于stack exchange,提问作者user874737

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:03:27