Javascript do while循环中的变量范围

Javascript do while循环中的变量范围,javascript,discord,discord.js,Javascript,Discord,Discord.js,好吧,我对JS和Discord.JS还不熟悉,上周我开始编写一个小的Discord机器人 我希望我的机器人能够删除特定频道中超过6天的所有邮件 我必须面对的主要问题是: 1-我无法使用message.channel.bulkDelete(),因为它无法删除超过14天的邮件 2-message.channel.messages.fetch()最多只能获取100条消息 我写了这段代码: try { if (message.channel.id === '<TheChannelI

好吧,我对JS和Discord.JS还不熟悉,上周我开始编写一个小的Discord机器人

我希望我的机器人能够删除特定频道中超过6天的所有邮件

我必须面对的主要问题是:

1-我无法使用
message.channel.bulkDelete()
,因为它无法删除超过14天的邮件

2-
message.channel.messages.fetch()
最多只能获取100条消息

我写了这段代码:

    try {
    if (message.channel.id === '<TheChannelID>') {
        do {
            let TargetedMsgs = 0 // Initializing my counter of the messages that meet my date condition
            message.channel.messages.fetch().then(messages => { // fetching the messages in the channel (100 max)
                messages.forEach(message => { // loop through each message in the fetched messages
                    let Today = new Date()
                    let TargetDate = new Date(Today.setDate(Today.getDate()-6))
                    if (message.createdAt < TargetDate) { // the message is older than 6 days
                        message.delete()
                        TargetedMsgs ++ // There is at least on message that meets the condition in this fetch batch
                    }
                })
            })
        }
        while (
            TargetedMsgs > 0
        )
    }
}
catch (err){
    console.error(err)
}  
在我的while状态下。

我明白为什么。这是因为我的
let targetedmgs
超出范围,因为它超出了我的
do

问题是,我怎样才能完成我想做的事?使用for循环?我不知道怎么做

我很乐意接受你的建议


提前感谢!:)

您可以尝试使用Const这个变量

常数为0

或者把它放在你需要的地方

messages.forEach(message => { // loop through each message in the fetched messages

                    let Today = new Date()

                    let TargetedMsgs = 0

                    let TargetDate = new Date(Today.setDate(Today.getDate()-6))

                    if (message.createdAt < TargetDate) { // the message is older than 6 days
                        message.delete()

                        TargetedMsgs ++ // There is at least on message that meets the condition in this fetch batch

                    }
messages.forEach(message=>{//循环遍历获取的消息中的每条消息
let Today=新日期()
设targetedMgs=0
让TargetDate=新日期(Today.setDate(Today.getDate()-6))
如果(message.createdAt
好吧!感谢@ibrahimmahrir的帮助,他让我走上了正确的道路,我找到了解决主要问题的方法

问题是
fetch()
方法是异步的,我需要等待(使用wait操作符)它才能删除目标消息。 我还更改了过滤消息的方式,以仅检索我想要的消息

代码如下:

if (message.channel.id === config.MyChannelID) {
    try {
        let TargetedMsgsCount // Initializing my variable which I use in my do/while loop
        do {
            TargetedMsgsCount = 0
            await message.channel.messages.fetch({limit:100}).then(messages => {
                let Today = new Date()
                let TargetDate = new Date(Today.setDate(Today.getDate()-6))
                let TargetedMsgs = messages.filter(msg => msg.createdAt < TargetDate)
                TargetedMsgs.forEach(TargetedMsg => {
                    TargetedMsg.delete()
                    TargetedMsgsCount ++ // So if there is at least one message that match my date condition, there is maybe more
                })
            })
        }
        while (
            TargetedMsgsCount > 0
        )
if(message.channel.id==config.MyChannelID){
试一试{
让targetedMgsCount//初始化我在do/while循环中使用的变量
做{
targetDMSGCount=0
等待message.channel.messages.fetch({limit:100})。然后(messages=>{
let Today=新日期()
让TargetDate=新日期(Today.setDate(Today.getDate()-6))
让TargetedMsgs=messages.filter(msg=>msg.createdAt{
targetedsg.delete()
targetedMgsCount++//因此,如果至少有一条消息符合我的日期条件,则可能会有更多消息
})
})
}
当(
TargetDMSGCount>0
)
这样,我的循环现在就可以了

<>我现在又有一个问题了,但这不是我的主要问题,这将是一个话题,所以我认为这个问题已经结束了。
如果您阅读本文,再次感谢Ibrahim!

如果您使用
let
声明变量,那么该变量只能在块内部可见(即
{
内部,并且它与
}
匹配)。将声明移动到循环外部:
让targetedsgs=0;do{…}while(…)
提醒:在解决该问题后,您将遇到另一个问题,即循环总是在第一次迭代时退出。这与
获取
是异步的,并且
while(targetedmgs>0)
回调之前进行计算,然后调用
时,因此当
while(TARGETEDMGS>0)
到达时,
而targetedMgs
0
,循环将立即退出。@ibrahimmahrir感谢您的回答!没错,这是我的问题。我该如何解决这个问题?我该如何编写代码,以便继续执行实际do块中的内容,直到不再有任何超过6天的消息为止?可能是另一种类型的循环?但哪一种?我想不出解决方案…你能把函数/方法变成
async
one吗?@ibrahimmahrir如果可以,我不知道怎么做…我还在学习tho',也许今晚我会找到一些东西…但我愿意用其他方式来完成我想做的事情!:)嘿,谢谢你的贡献。你对“Consting”(这是动词吗?)这个变量有什么想法?如果它是常量,我将无法更改它的值。在你显示的块中,它不能解决这样一个事实,即只有一次获取不足以删除我要删除的所有消息。
if (message.channel.id === config.MyChannelID) {
    try {
        let TargetedMsgsCount // Initializing my variable which I use in my do/while loop
        do {
            TargetedMsgsCount = 0
            await message.channel.messages.fetch({limit:100}).then(messages => {
                let Today = new Date()
                let TargetDate = new Date(Today.setDate(Today.getDate()-6))
                let TargetedMsgs = messages.filter(msg => msg.createdAt < TargetDate)
                TargetedMsgs.forEach(TargetedMsg => {
                    TargetedMsg.delete()
                    TargetedMsgsCount ++ // So if there is at least one message that match my date condition, there is maybe more
                })
            })
        }
        while (
            TargetedMsgsCount > 0
        )