如何在与“setInterval”不同的 if 语句中使用“clearInterval”

Posted

技术标签:

【中文标题】如何在与“setInterval”不同的 if 语句中使用“clearInterval”【英文标题】:How to use "clearInterval" in a different if statement to the "setInterval" 【发布时间】:2020-11-27 15:42:36 【问题描述】:

我已经尝试搜索其他示例,以自行解决此问题,但我对一般编码相当陌生,而且我对 java 脚本也很陌生,所以我提前为我犯的任何愚蠢错误道歉。

基本上,我正在学习 javascript,我认为一种很好的交互式学习方式是制作一个不和谐的机器人,这样我就可以“看到”我的努力得到回报,从而保持我的动力。我决定一个基本的垃圾邮件机器人将是一个很好的起点,让我熟悉最基本的方面。

经过一些研究,我发现方法“setInterval”似乎非常适合我心目中的应用程序。此方法将在给定的时间间隔执行一行代码。

所以我可以让我的机器人向不和谐频道发送垃圾邮件就好了,但我遇到的这个问题是如果我想让它停止。

client.on('message', message =>            //reacting when ever the 'message' EVENT occurs (e.g. a message is sent on a text channel in discord)

console.log('A message was detected and this is my reaction');
console.log(message.author + ' also knows as ' + message.author.username + ' said:\t' + message.content);       //message.author is the value of the person who sent the message, message.content is the content of the message


if(message.author.bot) 
    return null                 //returns nothing if the message author is the bot


 else if (message.content.startsWith(`$prefixspam`)) 
    
    let timerId = setInterval(() =>                                            //starts to spams the channel
        message.channel.send('spamtest');
    , 1500);   


 else if (message.content.startsWith(`$prefixstop`)) 

    clearInterval(timerId);
    message.channel.send('condition met');


);

我在这里得到的错误是 timerId 没有定义。所以我认为那是因为它是一个局部变量,现在我很难过。我不知道还有什么可以尝试的,而且我对这么简单的事情感到非常沮丧,所以我希望这里的人可以提供帮助。

谢谢

【问题讨论】:

let 是块作用域...并且您在两个单独的块中使用它 - 尝试在第一个 if 上方声明 let timerId @JaromandaX 是对的。那会奏效的。您无法在 if 块之外访问 timerId 是的,谢谢伙计们/女孩们,我为我现在的愚蠢感到畏缩:3 【参考方案1】:

正如Jaromanda X in the comments 所述,let 关键字在当前块作用域中声明了一个变量,使得该变量无法被另一个块作用域(另一个 else if 块)访问。

要解决这个问题,您需要在全局范围内声明变量timerId,以便所有其他块范围都可以访问它:

let timerId; // declare timer in global scope

client.on('message', message =>            //reacting when ever the 'message' EVENT occurs (e.g. a message is sent on a text channel in discord)

console.log('A message was detected and this is my reaction');
console.log(message.author + ' also knows as ' + message.author.username + ' said:\t' + message.content);       //message.author is the value of the person who sent the message, message.content is the content of the message


if(message.author.bot) 
    return null                 //returns nothing if the message author is the bot


 else if (message.content.startsWith(`$prefixspam`)) 
    
    timerId = setInterval(() =>                                            //starts to spams the channel
        message.channel.send('spamtest');
    , 1500);   


 else if (message.content.startsWith(`$prefixstop`)) 

    clearInterval(timerId);
    message.channel.send('condition met');


【讨论】:

以上是关于如何在与“setInterval”不同的 if 语句中使用“clearInterval”的主要内容,如果未能解决你的问题,请参考以下文章

setInterval如何在结束后返回执行结果?

setTimeout和setInterval的返回值是啥类型的,它有啥意义

如何使用 setInterval 和 clearInterval?

如何在反应中使用 setInterval?

如何在与 ubuntu 中默认端口 6379 不同的端口上启动 redis-server

如何启动在与小部件不同的包中定义的活动?