在setInterval运行时使用clearInterval

时间:2018-08-15 01:53:39

标签: javascript discord.js

这是使用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()中,并放在一个单独的命令中,两者都不要停止它。

它需要停止的唯一原因是添加/删除引号。否则,它可能会无限运行。

有什么建议吗?

1 个答案:

答案 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;
}