Javascript do while循环中的变量范围
好吧,我对JS和Discord.JS还不熟悉,上周我开始编写一个小的Discord机器人 我希望我的机器人能够删除特定频道中超过6天的所有邮件 我必须面对的主要问题是: 1-我无法使用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
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
)