【问题标题】:pass result from AwaitReactions out of function discord.js将 AwaitReactions 的结果从函数 discord.js 中传递出去
【发布时间】:2019-10-19 00:46:14
【问题描述】:

我是异步函数的新手。我想利用下面的代码向用户提出问题并用 X 或复选标记对问题做出反应,以让用户回答是否要删除某些内容以便为新条目腾出空间。

下面的函数工作得很好。但是,我想将函数的结果从函数中传递出去,这样我就可以在函数之外创建一个 if else 语句,这就是我卡住的地方。

我在网上环顾四周,看到了一些与正在使用的回调相关的东西,但是我看到的每个示例对于我认为相似的东西都是不同的,所以我只是感到困惑。而且这些示例都没有用于 Discord 上的 Reactions,所以我只是不确定该去哪里。


     const agree = "✅"
     const disagree = "❌"
     let msg = await message.author.send("You have made the maximum number of decks. Would you like to delete one of your decks in order to make a new one? Please react with one of the following...")
     await msg.react(agree)
     await msg.react(disagree)


     const filter = (reaction, user) => {
     return ['✅', '❌'].includes(reaction.emoji.name) && user.id === message.author.id;
     };
     const reactions = await msg.awaitReactions(filter, {
        max: 1
        }).then(collected => {
        const result = collected.last();

        })
        return result;
        }

     deleteDeckQuestion(function(result){
        console.log(result)
        }).catch(err => console.error(err))

当我运行 deleteDeckQuestion 时,上面的代码会导致“未定义”被记录到控制台。否则没有错误。我希望它使我可以在函数之外访问 Results 变量,这样我就可以根据用户添加到问题中的反应来做出 if else 语句。

我尝试将我想使用的 if else 语句与 deleteDeckQuestion 的结果一起放在异步函数中,它运行良好,但是在该函数的“是”结果中,我想放置另一个异步函数来询问哪个甲板 1、2 或 3 应该被删除并且具有相同的反应-确定-回答-问题的场景。只是为移动用户节省了不必要的输入。

将一个异步函数放在另一个异步函数中会更容易吗?有些事情告诉我,就效率而言,这不是最好的主意。最终,这些反应将导致使用 mysql 查询,我很喜欢使用它,但它会变得非常冗长,并且其他函数中的函数看起来就像一团糟......不确定这是否是“回调地狱”的一部分我'虽然读过其中的乐趣......

提前感谢您的帮助。

【问题讨论】:

    标签: node.js asynchronous discord.js


    【解决方案1】:

    then() 回调中的collectedreactions 是完全相同的对象。但是,result 的作用域仅限于回调内。

    在此示例代码中,collectedmsg.awaitReactions(...) 已履行承诺的结果。然后,result 被声明在同一范围内,因此可以在您需要的地方访问。

    const collected = await msg.awaitReactions(filter, { max: 1 })
      .catch(console.error);
    
    const result = collected.first();
    

    MDN:Async Programmingawaitthen()scope
    Discord.js:Message.awaitReactions()

    【讨论】:

    • 感谢您的快速回复!我用示例代码替换了函数的后半部分,但函数的运行没有将任何内容记录到控制台。没有错误或任何东西,根本没有任何记录。
    • console.log(result)?
    • 是的。我所做的只是用您的示例代码替换代码功能块末尾的“常量反应”。我单独从我的代码中留下了最底部的块,当我运行这个函数所属的命令时没有任何反应。它提出问题,以正确的反应对问题作出反应。我单击复选标记反应,没有任何反应。没有任何记录。
    • 我希望截图没问题,因为代码都显示在上面。但这就是我现在设置它的方式。 i.gyazo.com/1a0e77cc44a8ae2d804f77340c85a198.png
    • 在你的函数声明中,你没有声明回调的参数。您可以使用此答案中显示的相同设置来获取函数的结果 - const result = await deleteDeckQuestion();
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多