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

Receiving DiscordJS Promise Object Instead of Resolution For Fetch User Nickname

我正在尝试创建排名 list/leaderboard,但是在尝试映射值时,返回的是承诺对象而不是字符串。我知道使用 fetch 我需要使用 .then() 来处理承诺,但是我不知道如何将已解决的承诺传递给 map 函数中的项目,以便输出正确。

预期输出格式:

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:

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");

}