这是使用JS的新手,它试图创建一个采用JSON数组的Discord机器人,从关联密钥中随机选择1个值,并每24小时自动将其输出一次(基本上是当天bot的报价)。
我目前正在使用setInterval
来执行此操作,但是,clearInterval
在运行时却无法运行,而只能使用ctrl + C
PowerShell。
client.on('message', function(message) {
if(message.author.bot) return;
if(message.content.indexOf(config.prefix) !== 0) return;
const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if (command === "qotd")
{
const intervalSet = args.join(" ")
message.channel.send(randomQuestion())
var interval = setInterval (function ()
{
//randomQuestion() is the function that returns the randomly selected value
//message.channel.send(randomQuestion()) is there twice so it runs once
//before the timer starts (otherwise it'll take x time to output once
message.channel.send(randomQuestion())
.catch(console.error) // add error handling here
return interval;
}, intervalSet);
}
if (command === "stopqotd")
{
clearInterval(interval);
}
});
我尝试将另一个带有clearInterval(interval)
的命令放在相同的client.on()
中,并放在一个单独的命令中,两者都不要停止它。
它需要停止的唯一原因是添加/删除引号。否则,它可能会无限运行。
有什么建议吗?
答案 0 :(得分:0)
您的interval
变量不在您尝试调用clearInterval()
的位置的范围内。
要修复,请将其移至更高的范围:
let interval;
if (command === 'qotd') {
// ...
interval = setInterval(function() {/*...*/}, intervalSet);
}
if (command === 'stopqotd') {
clearInterval(interval);
}
这仍然使您处于以下情况:如果收到多个qotd
命令,则将运行多个间隔,而stopqotd
命令只会停止最后一个间隔。
解决此问题的一种方法是将interval
清除为undefined
,然后在收到qotd
命令时测试该值。
let interval;
if (command === 'qotd') {
// ...
if (!interval) {
interval = setInterval(function() {/*...*/}, intervalSet);
} else {
message.channel.send('QOTD already running');
}
}
if (command === 'stopqotd') {
clearInterval(interval);
interval = undefined;
}