【问题标题】:Stop an infinite loop when correct reaction is met discord.js遇到正确反应时停止无限循环 discord.js
【发布时间】:2022-01-12 17:15:00
【问题描述】:

我正在创建一个不和谐的机器人命令,它会在问题的消息上给出一个问题和两个表情符号,供用户做出反应。如果您选择了错误的表情符号,机器人会告诉您“错误”,再次对消息做出反应,然后等待用户做出反应。我想把它放到一个无限循环中,只有当用户选择正确的表情符号时才会停止。这是我迄今为止所做的工作:

            message.channel.send(`Question?`).then(sentMessage => {
                sentMessage.react('✅');
                sentMessage.react('❌');

                const filter = (reaction, user) => {
                    return ['✅', '❌'].includes(reaction.emoji.name) && user.id != `${bid}`; // bid = bot's id
                };

                sentMessage.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] }).then(collected => {
                    var reaction = collected.first();
                    if (reaction.emoji.name === '❌') {
                        var check = true;
                        while (check) {
                            console.log('?');
                            message.channel.send('Wrong').then(sentMessage => {
                                sentMessage.react('✅');
                                sentMessage.react('❌');

                                const filter = (reaction, user) => {
                                    return ['✅', '❌'].includes(reaction.emoji.name) && user.id != `${bid}`;
                                };

                                sentMessage.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] }).then(collected => {
                                    var reaction = collected.first();

                                    if (reaction.emoji.name == '✅') check = false;
                                });
                            });
                        }
                    }
                });
            });

这个想法是当用户在第一次反应一些❌后最终反应✅时,check将变为false并且循环将停止。然而,在第一次选择 ❌ 之后,while 循环除了循环 console.log('?') 之外没有运行任何代码。谁能指出我哪里做错了?

【问题讨论】:

  • 你不会想要一个阻止你的事件循环过程这样做的循环。
  • 这是否意味着我不应该在then 中放置无限循环?

标签: javascript node.js discord.js


【解决方案1】:

在您的代码中,您发送Wrong 并将反应检查逻辑放入then 并用while 包装。 然而,由于Channel.send 返回一个 Promise,它几乎会立即结束,继续循环,同时执行Channel.send 和反应逻辑。 您可以使用异步函数并递归调用它。 所以代码是这样的:

message.channel.send(`Question?`).then(sentMessage => {
                sentMessage.react('✅');
                sentMessage.react('❌');

                const filter = (reaction, user) => {
                    return ['✅', '❌'].includes(reaction.emoji.name) && user.id != `${bid}`; // bid = bot's id
                };

                sentMessage.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] }).then(collected => {
                    var reaction = collected.first();
                    if (reaction.emoji.name === '❌') {
                        async function reactionLoop() {
                            console.log('?');
 
                            let sentMessage = await message.channel.send('Wrong');
                            await sentMessage.react('✅');
                            await sentMessage.react('❌');

                            const filter = (reaction, user) => ['✅', '❌'].includes(reaction.emoji.name) && user.id != `${bid}`;
                            let collected = await sentMessage.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] })
                            var reaction = collected.first();

                            if (reaction.emoji.name == '✅') await reactionLoop();                
                        }
                        reactionLoop();
                    }
                });
            });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-06
    • 2020-10-27
    • 1970-01-01
    • 2021-10-21
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多