繁体   English   中英

如何正确实现包含awaitMessages的循环?

[英]How to properly implement a loop that includes awaitMessages?

因此,基本上,我正在为我的Discord机器人创建一个快速设置命令。 这个想法是通过一系列提示让他们选择允许他们选择想要使用哪些命令的角色的角色。 问题是,如果(出于某种原因,由于他们提到了角色,这并没有多大意义,但是当涉及到错误时,没有任何障碍),他们选择了一个不存在的角色,它允许它们在命令的“阶段”重新启动。 我想这样做,我需要一个循环,因为理想情况下,如果他们继续选择的角色不存在,它可以使他们无限地重试。

我已经尝试了很多不同的for/while循环和while循环,但都失败了,但是它们都耗尽了内存,我相信这表明它不断无限地生成新的awaitMessages实例。

这是我目前可以使用的代码(没有“捕获”错误)

message.channel.send('Choose your moderator role.').then(async (modQ) => {
                        message.channel.awaitMessages(filter, {maxMatches: 1, time: 60000, errors: ['time']}).then(async (modC) => {
                            await modQ.delete()
                            await modC.first().delete()
                            let Found = modC.first().mentions.roles.first()
                            if (Found) {
                                let chosen = String(modC.first().mentions.roles.first().id)
                                setArgs(chosen, 'generalRoles', 'generalRole_id')
                            } else {
                                message.channel.send('No')
                            }
                        })
                    })

我知道提示和消息每次都需要一段时间,并且在那个时间范围内循环可能已经运行了数百万次,但是老实说,我不知道如何在每个“阶段”进行无限次重试。

我希望每次发送“选择主持人角色”消息,并在选择角色(成功或不成功)之后删除该消息,如果该角色有效,则转到if (Found)部分,如果该角色无效,因为它会循环播放并重试。

因此,我能够通过一些工作来解决这个问题,并且由于似乎其他人也存在此问题,因此我将回答而不是删除。

所以这是我正在工作的代码:

message.channel.send(mod).then(async (modQ) => {
                        message.channel.awaitMessages(filter, {maxMatches: 1, time: 60000, errors: ['time']}).then(async (modC) => {
                            await modQ.delete()
                            await modC.first().delete()
                            let Found = modC.first().mentions.roles.first()
                            let found = false;
                            if (Found) {
                                found = true;
                                let chosen = String(modC.first().mentions.roles.first().id)
                                setArgs(chosen, 'generalRoles', 'generalRole_id')
                                console.log('worked1')
                            } else {
                                while (found === false) {
                                    await message.channel.send('Hey').then(async (modQ) => {
                                        await message.channel.awaitMessages(filter, {maxMatches: 1, time: 60000, errors: ['time']}).then(async (modC) => {
                                            await modQ.delete()
                                            await modC.first().delete()
                                            let Found = modC.first().mentions.roles.first()
                                            if (Found) {
                                                let chosen = String(modC.first().mentions.roles.first().id)
                                                setArgs(chosen, 'generalRoles', 'generalRole_id')
                                                console.log('worked2')
                                                found = true
                                            }
                                        })
                                    })
                                }
                            }
                            if (found === true) {
                                message.channel.send('We here now.')
                            }
                        })
                    })

希望这可以帮助某人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM