更改 Javascript setInterval

Changing Javascript setInterval

我正在 Javascript 中试验 setInterval 和 clearInterval 方法,但我 运行 遇到了问题。我想要做的是在大多数时间名义上每 "x" 秒调用一个函数,但在某些时间间隔,运行 更频繁。我已经附上了一些代码,这是我到目前为止得到的一些不完整的骨架,这是一个简单的概念证明 - 在这个例子中,每 10 秒显示一次分钟,否则显示 30 到 40 分钟(如虚拟值,看看我是否能让它工作),显示每 1 秒更新一次。但是我意识到我无法检查 setInterval 是否仍然是 运行ning 以及如何重新启动它(作为 "myVar" 变量)。

<!DOCTYPE html>
<html>
<body>

<p id="demo">Just testing...</p>

<script>

var d = new Date();

myVar = setInterval( informUser, 10000);

function informUser()
{

if ( d.getMinutes()>30 && d.getMinutes()<40 ) // every second
{
    clearInterval(myVar);
    mvVar = setInterval( informUser, 1000);
    document.getElementById("demo").innerHTML = d.getMinutes();     
}
else // else 10 seconds
{
     document.getElementById("demo").innerHTML = d.getMinutes();    
}

}

</script>

</body>
</html> 

正如我所说的代码非常不完整一样,我运行撞墙了!一旦我有了一些工作,我可以让它更复杂一点。 编辑:

感谢您对语法的评论,但这不是这里的全部问题。 代码目前所做的是每 10 秒将分钟输出到屏幕,直到达到整点后 31 分钟。然后它停止计时器,并使用 1 秒的间隔启动它。 9 分钟后,代码停止,因为计时器未启动。

我想做的是在 "else // else 10 seconds" 部分查看 myVar 是否为空;如果是,则重新启动计时器,间隔 10 秒。

有几件事使您的问题不清楚。

"see if the setInterval is still running"。基本上,它总是 运行,你唯一一次停止它是 clearInterval,然后你再次启动它。

同样,myVar 永远不会为空。

而在 31 到 39 的时间段内,你确实没有使用 "interval" -- 你每次都在清除它并重新启动它。

这个怎么样:

var d = new Date();

currInterval = 10000;
myVar = setInterval( informUser, currInterval);

function informUser()
{
   document.getElementById("demo").innerHTML = d.getMinutes();     

   intervalShouldBe = 10000;

   if ( d.getMinutes()>30 && d.getMinutes()<40 ) 
       intervalShouldBe = 1000;

   // stop and restart only when interval needs to change
   if(currInterval != intervalShouldBe) {

      clearInterval(myVar);
      myVar = null;
      myVar = setInterval( informUser, intervalShouldBe);
      currInterval = intervalShouldBe;
   }
}

Date 对象是在函数外部创建的,因此保持不变。

计时器持续时间未在 else 块中更新。

在每种模式下重新创建间隔计时器可能会因漂移而产生一些奇怪的效果。相反,创建一个超时时间为两个所需间隔的最大公约数的计时器,计算其触发次数,并根据该计数创建逻辑。

interval = setInterval( informUser, 1000);
intervalCount = 0;

function informUser() {
    var minutes = Date.now().getMinutes();
    intervalCount++;

    if(minutes > 30 && minutes < 40) {
      intervalCount = 0;
      document.getElementById("demo").innerHTML = minutes;
    }
    else if (intervalCount >= 10) {
      intervalCount = 0;
      document.getElementById("demo").innerHTML = minutes;
    }

}