当正确的反应不一致时,停止无限循环



我正在创建一个discordbot命令,该命令在问题消息上提供一个问题和两个表情符号,供用户做出反应。如果你选择了错误的表情符号,机器人会告诉你"错误";,对消息再次作出反应,并等待用户作出反应。我想把它放入一个无限循环,只有当用户选择正确的表情符号时才会停止。这就是我迄今为止所做的工作:

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

这个想法是当用户最终做出反应时✅在第一次反应后❌,CCD_ 1将变为CCD_ 2并且循环将停止。然而,在第一次选择之后❌,while循环除了循环CCD_ 3之外不在其内部运行任何代码。有人能指出我哪里做错了吗?

在您的代码中,您发送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();
}
});
});

最新更新