接收 DiscordJS Promise 对象而不是获取用户昵称的解析

Posted

技术标签:

【中文标题】接收 DiscordJS Promise 对象而不是获取用户昵称的解析【英文标题】:Receiving DiscordJS Promise Object Instead of Resolution For Fetch User Nickname 【发布时间】:2021-10-25 00:56:15 【问题描述】:

我正在尝试创建排名列表/排行榜,但是在尝试映射值时,会返回一个承诺对象而不是字符串。我知道使用 fetch 我需要使用 .then() 来处理 promise,但是我不知道如何将解析的 promise 传递给 map 函数中的 item,以便输出正确。

预期输出格式:

LeaderBoard:
<Username> - <# Of Points>
.
.
.
.
.
<Last Username> - <Last # Of Points>

代码:

const buildLeaderBoard = async () => 
  const list = await db.collection("Karma").find(, upsert: true).sort( karma: -1 ).toArray()
    mappedlist = list.map(async function(item)
    item = await client.users.fetch(`$item.member`).then((value) =>
    return `$value.nickname - $item.karma`;
    );
    return item;
    ).join(`\n`);

Current Output:

【问题讨论】:

【参考方案1】:

Array.map() 本身不适用于异步函数。您可以改为使用 for 循环:

const buildLeaderBoard = async () => 
  const list = await db.collection("Karma")
      .find(, upsert: true)
      .sort( karma: -1 ).toArray(),
    mappedList = [];
  for (let i = 0; i < list.length; i++) 
    const item = list[i],
      value = await client.users.fetch(`$item.member`)
        .then((value) => 
          return `$value.nickname - $item.karma`;
        );
    mappedList.push(value);
  
  return mappedList.join("\n");

你也可以使用Promise.all():

const buildLeaderBoard = async () => 
  const list = await db.collection("Karma")
      .find(, upsert: true)
      .sort( karma: -1 ).toArray(),
    mappedList = list.map(async (item) => 
      const data = await client.users.fetch(`$item.member`)
        .then((value) => `$value.nickname - $item.karma`)
      return data;
    );

  return (await Promise.all(mappedList)).join("\n");


【讨论】:

非常感谢,帮了大忙 :)

以上是关于接收 DiscordJS Promise 对象而不是获取用户昵称的解析的主要内容,如果未能解决你的问题,请参考以下文章

如何从对象的`get()`获取异步数据而不返回Promise

DiscordJS v12 userinfo 命令不起作用

设置状态的新 Promise 接收箭头函数

将变量导出到其他文件 discordjs

我期望从 API 响应中接收一组对象,但在使用 TypeScript 的 React 中获得一组 Promise

async/await 中await接收的promise的问题