2015-09-28 105 views
0

嗨我是编程新手,正在研究JavaScript时钟。我用它来改变背景颜色,取决于它是偶数还是奇数分钟,并且它每小时改变文本颜色。不过,我在整合第三项任务时遇到了困难:我试图让它每五分钟更换一个随机颜色,从而覆盖偶数或奇数的语句。那么分1:奇数,分2:偶数,3:奇数,4:偶数,5:随机颜色。JavaScript时钟:时间间隔冲突

由于每隔5分钟更改背景颜色的功能(lines 75 to 83)在间隔上设置,与为获取日期设置的间隔(line 71)相冲突。

现在,任务2和3的效果在任务1被注释掉之前不可见。有没有办法将Task 1与第11-24行的if/else语句结合起来,以便我的所有任务可以同时运行?

+0

你能显示你的代码吗? – caasjj

+1

您的代码的相关部分必须发布到您的实际问题中,而不是仅通过外部链接提供。在StackOverflow中这是一条规则,因为外部链接往往会消失或随时间而改变,从而导致问题随着时间的推移而变得无用。 – jfriend00

+1

你不应该使用* setInterval *,因为它不需要在你指定的时间运行,所以每次运行一会儿(可能是纳秒,也许是毫秒,或许更多)。使用* setTimeout *并计算每次下次呼叫的时间。另外,不要设置多个间隔或超时,使用一个超时以所需顺序运行所有逻辑。 – RobG

回答

0

使用单个计时器功能执行所有事件。为了获得更准确的时序,请将您的计时器设置为每100毫秒执行一次并维护一个计数器。根据计数器值,您可以以不同的时间间隔执行特定任务,并检查时间间隔的重叠情况。当计数器达到您需要跟踪的最大间隔时,计数器可以重置。

这里有一个例子:

var counter = 0; 
var oldsec = 0; 
setInterval(function(){timerInt()}, 100); 

function timerInt(){ 
    // Read system clock and get seconds 
    if (seconds <> oldsec) { 
     // Update clock time here and set oldsec=seconds 
    } 


    // Execute other tasks 
    if (counter % 3000 == 0) { // Executes once every 5 minutes (300*10) 

    } 
    else if (counter % 1200 == 0) { // Executes once in 2 minutes (120*10) 

    } 
    else if (counter % 600 == 0) { // Executes once a minute (60*10) 

    } 

    counter += 1; 
    if (counter == 3000) counter = 0; 
} 

您可以使用ifelse,用于控制执行哪些任务。你的时钟秒更新也会更准确,不会像“1000毫秒”定时器那样“跳过”秒。

+0

在无论何种原因延迟的时钟漂移或setTimeout回调的情况下,这都无法正常工作。 – 2015-09-28 03:05:24

+0

不能有任何时钟漂移,因为我们会从系统时钟读取数据,然后更新文本。如果回调由于某种原因而延迟,那么所有基于定时器的解决方案都将受到影响。无论如何,这是一个简单的时钟项目,我想不会有重复代码运行。 :) – navigator

+0

你正是**不**从系统时钟读取。你假设回调会每十分之一秒发生一次,但实际上它永远不会发生。我不认为时钟不准确地告诉时间是非常好的时钟。有很好的方法来解决这个问题。它们都基于在每个回调中查询真实系统时钟。 – 2015-09-28 03:25:12