【问题标题】:Changing Javascript setInterval更改 Javascript setInterval
【发布时间】:2017-04-18 13:53:11
【问题描述】:

我正在尝试使用 Javascript 中的 setInterval 和 clearInterval 方法,但遇到了问题。我正在尝试做的是在大多数情况下名义上每“x”秒调用一个函数,但在某些时间间隔内,更频繁地运行。我附上了一些代码,这些代码是迄今为止我所拥有的东西的不完整的骨架,这是一个简单的概念证明 - 在这个例子中,每 10 秒显示一次分钟,否则在 30 到 40 分钟之间(如虚拟值,看看我是否可以让它工作),显示每 1 秒更新一次。但我意识到我无法检查 setInterval 是否仍在运行以及如何重新启动它(作为“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> 

正如我所说,代码非常不完整,因为我遇到了一堵砖墙!一旦我有一些工作,我可以让它更复杂一点。 编辑:

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

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

【问题讨论】:

  • 请注意,setInterval 函数的第一个参数应该是对函数的引用(而不是对函数的调用,除非该调用返回对另一个函数的引用功能)。你应该使用setInterval(informUser, X)
  • 谢谢,我会在上面修改(如果可以的话)
  • 您可以更改,但这也是您问题的答案。用您自己的代码更新它并检查。它应该可以解决您的问题。
  • 你查看我最后的评论了吗?那里还有问题吗?
  • 我的代码还是有问题。我正在尝试根据计算机的内部计时器为计时器提供两个不同的值。

标签: javascript setinterval clearinterval


【解决方案1】:

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

}

【讨论】:

    【解决方案2】:

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

    “查看 setInterval 是否仍在运行”。基本上,它一直在运行,唯一一次你停止它是 clearInterval,然后你再次启动它。

    同样,myVar 永远不会为空。

    在 31 到 39 的时间段内,你真的没有使用“间隔”——你每次都在清除它并重新启动它。

    这个怎么样:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 2011-08-13
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多