2016-12-03 65 views
0

我正在试验Javascript中的setInterval和clearInterval方法,但我遇到了问题。我试图做的是在大多数时间内名义上每调用一次“x”秒,但在一定的时间间隔内运行更频繁。我已经附上了一些代码,这是迄今为止我所得到的一些不完整的代码,这是一个简单的概念验证 - 在本例中,每隔10秒钟显示一次分钟,否则在30到40分钟之间(如虚拟值以查看是否可以使其工作),显示屏每隔1秒更新一次。但我意识到我无法检查setInterval是否仍在运行以及如何重新启动它(作为“myVar”变量)。更改Javascript setInterval

<!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分钟后,代码停止,因为定时器未启动。

我希望做的是在“其他/其他10秒”部分查看myVar是否为空;如果是,则重新启动定时器,间隔时间为10秒。

+0

请注意,'setInterval'函数的第一个参数应该是该函数的**引用**(而不是函数的调用,除非该调用返回对另一个函数的引用)。你应该使用'setInterval(informUser,X)' – Dekel

+0

谢谢,我会在上面修改它(如果可以的话) – user3713442

+0

你可以改变,但它也是你的问题的答案。在你自己的代码中更新它并检查。它应该解决你的问题。 – Dekel

回答

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

} 
0

一些事情让你的问题不清楚。

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