我的异步在等待电话中返回不确定



我正在使用discord.js bot工作,并且我有一个函数,该函数应该在数组中循环,并通过quelize返回每个元素的对象。每个值都应该放在地图中,然后返回地图。但它总是返回未定义的。

class top {
  async run (client, msg, args) {
    const member = msg.member
    let factionName = args[1]
    for (let index = 2; index < args.length; index++) {
      factionName += ' ' + args[index]
    }
    const embed = await topFaction(msg, member, factionName)
    msg.channel.send(embed)
  }
}
async function topFaction (msg, member, factionName) {
  const embed = new Discord.RichEmbed()
    .setTitle(member.displayName)
    .setFooter(member.displayName + '#' + member.user.discriminator, member.user.avatarURL)
  const actualSeason = await SeasonManager.getActualSeason()
  if (!actualSeason) return embed.setDescription(`Aucun saison n'est en cours.`).setColor('RED')
  if (!factionName) return embed.setDescription(`Vous devez entrer le nom d'une faction.`).setColor('RED')
  const faction = await FactionManager.getFaction(factionName)
  if (faction) {
    const users = await faction.getUsers()
    if (users.length === 0) return embed.setDescription('La faction est vide.').setColor('RED')
    const xpMap = await getXPMap(users)
    console.log('xpMap - ' + xpMap) // Is undefined
    return embed.setDescription('Classement').setColor('BLUE')
  } else {
    return embed.setDescription(`La faction ${factionName} n'existe pas.`)
      .setColor('RED')
  }
}
async function getXPMap (users) {
  let xpMap = new Map()
  syncEach(users, async function (user, next) {
    const actualXP = await ExperienceManager.getActualExperiences(user)
    if (actualXP) xpMap.set(user.get('discordID'), actualXP.get('count'))
    next(null)
  },
  function (err) {
    if (err) logger.log('error', err)
    console.log(xpMap) // Not undefined
    return xpMap
  })
}

i除了getxpmap((以返回填充地图,但我没有任何定义。

,因为sinceach有点奇怪(我不知道它很容易,源代码很容易(,我将其全部包裹在诺言中,可以解决回调

解决

async function getXPMap (users) {
 return new Promise((resolver)=>{
  let xpMap = new Map()
  syncEach(users, async function (user, next) {
    const actualXP = await ExperienceManager.getActualExperiences(user)
    if (actualXP) xpMap.set(user.get('discordID'), actualXP.get('count'))
    next(null)
  },
  function (err) {
    if (err) logger.log('error', err){
    console.log(xpMap) // Not undefined
    }
     resolver(xMap)
  })
 
 })
 
}

最新更新