【问题标题】:Using asynchronous function in conditional in nodejs在nodejs的条件下使用异步函数
【发布时间】:2022-01-26 01:44:30
【问题描述】:

我想为我的 discord 机器人制作一个 xp 排行榜。它完美地工作,除了它显示不在服务器中的用户,而是在不同的服务器中。我想出了如何检查该人是否在服务器中,但它返回了一个承诺。 on 消息功能是同步的。如果用户在服务器中,有什么方法可以等待我返回的异步函数?代码如下:

异步函数:

async function validUser(message, i) {
    valid = await message.guild.members.fetch(i).then(member => {
        console.log(member)
        return true
    }).catch(err => {
        return false
    })
    console.log(valid)
    return valid
}

排行榜代码:

                if (typeof i.split('channel')[1] === 'undefined' && await validUser(message, i)) {
                    if (typeof xpvals[i][2] != 'undefined') {
                        dudename = xpvals[i][2]
                        dudexp = xpvals[i][0]
                        dudefull = [dudename, dudexp]
                ...

【问题讨论】:

  • 我认为你的代码是错误的。当使用 await 时,您不需要使用 then。排行榜代码是同步的?
  • @JRichardsz 你不需要,但你可以。它被设计成这样工作,因为.then() 是可链接的并且总是返回一个 Promise。当你这样做时,await 等待链中最后一个 .then() 返回的承诺,而不是你调用的函数。所以在上面的代码中,await 关键字在.then() 上运行,而不是在.fetch() 上运行

标签: node.js discord.js


【解决方案1】:

我相信即使 fetch 未找到该成员,您的代码也会将变量 valid 作为 true 运行。 试试:

valid = await message.guild.members.fetch(i).then(member => {
    console.log(member)
    if(member) return true
    else return false
})

【讨论】:

  • 不错的收获。空结果通常 NOT 是错误,因此 catch() 不会捕获它
  • @slebetman 我相信如果找不到成员,它会抛出 404 not found
  • 一切正常,但我需要等待结果才能计算排行榜。
【解决方案2】:

Discord.js 让您同时拥有同步和异步形式的 on 消息。现在可以使用了。

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多