如何使用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
相关产品推荐
相关产品推荐

