[英]Stop an infinite loop when correct reaction is met discord.js
我正在創建一個 discord 機器人命令,該命令在問題的消息上給出一個問題和兩個表情符號,供用戶做出反應。 如果您 select 錯誤的表情符號,機器人會告訴您“錯誤”,再次對消息做出反應,並等待用戶做出反應。 我想把它放到一個無限循環中,只有當用戶選擇正確的表情符號時才會停止。 這是我迄今為止所做的工作:
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('?')
之外沒有運行任何代碼。 有人能指出我哪里做錯了嗎?
在您的代碼中,您發送Wrong
並將反應檢查邏輯放入then
並用while
包裝。 然而,由於Channel.send
返回一個 Promise,它幾乎會立即結束,繼續循環同時執行Channel.send
和反應邏輯。 您可以使用異步 function 並遞歸調用它。 所以代碼是這樣的:
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();
}
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.