【问题标题】:How to run and stop multiple Intervels in Javascript如何在 Javascript 中运行和停止多个间隔
【发布时间】:2023-01-12 12:52:52
【问题描述】:

假设我用 500 毫秒、1 秒、1.5 秒调用 3 个间隔。一旦我点击 500ms 按钮,我需要停止其他 2 个间隔运行仅 500ms。就像我点击 1s 然后停止之前的 500ms 间隔。我怎么弄明白。

socket.on("interval-1",(value)=>{
        console.log(value);
        if(value==1){
           
            var timer1  = setInterval(function(){
                let price = Math.floor(Math.random() * 100);
                socket.emit("price",price)
               
            },500);
            
        }
        
        else if(value==2){
           
           var timer2  = setInterval(function(){
                clearInterval(timer1)
                let price = Math.floor(Math.random() * 100);
                socket.emit("price",price)
                
            },1000);
        }
        else if(value==3){
          
            setInterval(function(){
                clearInterval(timer1)
                clearInterval(timer2)
                let price = Math.floor(Math.random() * 100);
                socket.emit("price",price)
                
            },1500);
        }
        
    })

我试过了,但是一旦我间隔它开始,当我点击运行其他间隔时它就不会停止。

提前致谢!

【问题讨论】:

  • 您需要将timer1timer2 声明为全局变量,这样当value = 3clearInterval 可以访问它们。
  • @Layhout - 好吧,不是作为全局变量,而是在模块的顶层。 scoket.on() 之上的范围。

标签: javascript node.js express intervals


【解决方案1】:

您的 timer1timer2 变量是 socket.on() 句柄的一次执行的本地变量,因此当后续处理程序到来时,您无法访问先前的变量。您可以通过在更高范围内声明计时器变量来解决此问题,以便在后续的 socket.io 消息中可以访问相同的变量。我建议这样的实现:

let previousTimer;

socket.on("interval-1", (value) => {
    console.log(value);
    // clear any previous interval timer so it doesn't keep going forever
    if (previousTimer) {
        clearInterval(previousTimer);
        previousTimer = null;
    }
    if (value == 1) {
        previousTimer = setInterval(function () {
            let price = Math.floor(Math.random() * 100);
            socket.emit("price", price)
        }, 500);
    } else if (value == 2) {
        previousTimer = setInterval(function () {
            let price = Math.floor(Math.random() * 100);
            socket.emit("price", price)
        }, 1000);
    } else if (value == 3) {
        previousTimer = setInterval(function () {
            let price = Math.floor(Math.random() * 100);
            socket.emit("price", price)
        }, 1500);
    }
});

笔记:我在此实现中声明的名为previousTimer 的变量是模块级变量,而不是全局变量。它只能由该模块中的代码访问。

另外,你应该停止使用var。现代 Javascript 应该使用 letconst,而不是 var

您通常还希望使用 === 进行比较,而不是 ==。如果value变量实际上是一个数字,而不是字符串,那么你应该使用===来比较它。与== 的比较将尝试进行类型转换,允许一个数字等于一个字符串,这可能会导致代码中出现非常不可预测的结果。

【讨论】:

  • 谢谢!它的工作
猜你喜欢
  • 1970-01-01
  • 2012-11-19
  • 2015-11-19
  • 1970-01-01
  • 2022-01-09
  • 2019-09-08
  • 2020-12-27
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多