簡體   English   中英

遇到正確反應時停止無限循環 discord.js

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM