如何从异步函数返回文本,解决Discord代码中[Object Promise]展示问题
问题原因
- 你定义的
fetchUser是异步函数,调用后返回的是Promise对象,没有等待异步请求完成就直接拼接进字符串,所以会直接打印Promise对象的默认字符串形式[Object Promise] - 你写的
.then(user => { user.tag })没有加return,就算等Promise执行完成也拿不到返回的user.tag值
修复方案
首先使用Promise.all批量并行获取所有排名用户的信息,等所有请求返回后再生成Embed内容发送,修改后代码如下:
const fetched = filteredResult.sort((a, b) => b.data - a.data).slice(0, 10) const fetchUser = async id => client.users.fetch(id); // 先批量获取所有用户信息 const userInfos = await Promise.all( fetched.map(async v => { const userId = v.ID.replace("globalMessages_", ""); const user = await fetchUser(userId); return { userTag: user.tag, thanksCount: v.data } }) ); // 生成描述内容 const description = userInfos.map((info, i) => { return `#${i + 1} **${info.userTag}** with ${commaNumber(info.thanksCount)} thanks\n`; }).join(''); // 发送消息 message.channel.send( new Discord.MessageEmbed() .setTitle("Pp Leaderboard") .setColor(roleColor === "#000000" ? "#ffffff" : roleColor) .setDescription(description) )
注意事项
- 这段代码必须放在async标记的函数内部才能使用
await关键字,如果你的外层函数没加async,要先给外层函数加上async修饰 - 可以补充异常捕获逻辑,避免部分用户ID失效拉取不到信息导致整个命令报错,比如在fetchUser的时候加catch兜底返回占位的用户标识
内容的提问来源于stack exchange,提问作者deadkill
相关产品推荐
相关产品推荐

