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

如何从异步函数返回文本,解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:09:03