2016-09-15 75 views
-3

我想在JavaScript中创建一个循环,我希望函数timeLoop()被调用10秒然后停止。我试图用setInterval来做到这一点,但似乎它不会等待我设置的超时时间,无论我设置超时时间有多大。每次我运行它时,我总是得到:RangeError:最大调用堆栈大小超出不知道如何创建一个定时循环,在执行之前等待一段时间。Javascript超时循环不会等待

var seconds = new Date().getSeconds(); 

var mainFunc = function() { 
     console.log("Time: " + seconds); 
     timeLoop(); 
} 


var timeLoop = function() { 
     var newTime = new Date().getSeconds(); 
     var timer = newTime - seconds; 
     console.log("New Time: " + newTime + " Elapsed time: " + timer); 

     if(timer == 10) { 
       clearInterval(timeLoop()); 
       return console.log("Times up 10 seconds!"); 
     } 

     setInterval(mainFunc(), 10000); 
} 



mainFunc(); 
+1

边注:['clearInterval()'](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearInterval)期望的间隔ID作为其参数。 'setInterval()'提供给你作为它的返回值。不过,你必须存储它。 ([示例](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval#Example_2_Alternating_two_colors)) –

+0

@zerkms,这不是一个重复的问题。它有一个看起来像另一个的问题,但原因是不一样的。这段代码中的问题是错误地使用了'clearInterval'。 –

+0

@DiegoZoracKy它实际上都是这样,并且'clearInterval'的问题已经在其他评论中得到澄清。请提供更好的答案。 – zerkms

回答

0

您必须设置间隔一次,但在此代码中,您可以在每次调用方法时设置它。如果你想检查时间差,也可以在开始时获得当前时间,然后在计时器上获得时间差。

更改它并使用setTimeout!

var startTime= new Date(); 
var mainFunc = function() { 
    console.log("Time: " + startTime); 
    timeLoop(); 
} 

var timeLoop = function() { 
    var newTime = new Date(); 
    // get time difference in miliseconds 
    // if you want it in seconds easily: parseInt(timer/1000) 
    var timer = newTime - startTime; 
    console.log("New Time: " + newTime + " Elapsed time (miliseconds): " + timer); 

    if(timer == 10000) { 
      return console.log("Times up 10 seconds!"); 
    } 

    setTimeout(mainFunc, 10000); 
} 
mainFunc(); 
+0

这正是我想要的,谢谢!现在唯一的问题是,比较时间时,如果秒得到59,newTime得到00,则它得到一个问题,其负秒和花费更长时间才能达到10.你知道他们最好的方式来实现这个并解决这个问题问题? –