Javascript 防止JS定时器溢出

Javascript 防止JS定时器溢出,javascript,ruby-on-rails,countdowntimer,Javascript,Ruby On Rails,Countdowntimer,我已经做了一个计时器从问题的最投票的答案。 问题是,当它达到0时,它将日期更改为第二天,并启动一个新的24小时计时器 Tl;博士 00:00:00->23:59:59,而不是永远停留在00:00:00 我当前的代码: function getTimeLeft() { var seconds_left = end_time - Math.floor(Date.now() / 1000); var time_left = new Date(seconds_left * 1000).toISO

我已经做了一个计时器从问题的最投票的答案。 问题是,当它达到0时,它将日期更改为第二天,并启动一个新的24小时计时器

Tl;博士 00:00:00->23:59:59,而不是永远停留在00:00:00

我当前的代码:

function getTimeLeft() {
  var seconds_left = end_time - Math.floor(Date.now() / 1000);
  var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
  $('#test-time-left').text(time_left);
}
setInterval(getTimeLeft, 1000);
为了保持00:00:00,我想到了两种解决方法

首先(最好是imho)给出
setInterval(getTimeLeft,1000)在<代码>中,而
循环条件<代码>剩余秒数>=0。但我对此没有什么问题

  • 我不知道如何将变量传递到函数之外

  • 我不知道阻止setInterval是否有用,但我还是把interval设置为0(因此关闭它)

  • 第二种方法是在函数内部执行

    while( seconds_left >= 0){
          var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
    }
    
    问题:

  • 浪费资源,因为JS脚本仍在执行中
  • @编辑最终结果:

    function getTimeLeft() {
      var seconds_left = end_time - Math.floor(Date.now() / 1000);
      if (seconds_left <= 0)
      {
        seconds_left = 0;
        clearInterval(timer);
      }
      var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
      $('#test-time-left').text(time_left);
    }
    var timer = setInterval(getTimeLeft, 1000);
    
    函数getTimeLeft(){ var seconds\u left=end\u time-Math.floor(Date.now()/1000);
    如果(剩余秒数假设您想在剩余秒数
    等于0时停止计时器,您只需清除间隔:

    function getTimeLeft() {
      var seconds_left = end_time - Math.floor(Date.now() / 1000);
      var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
      if(seconds_left === 0) {
        clearInterval(timer);  // clear the interval
      }
      $('#test-time-left').text(time_left);
    }
    
    var timer = setInterval(getTimeLeft, 1000);  //save the timer in a variable
    
    请注意,使用while循环的想法行不通:


    JavaScript是单线程的,这意味着当
    while
    循环运行时,间隔代码根本不会运行,因此会创建一个无限循环(可能会使浏览器崩溃).

    我同意Rick Hithcock所说的一切。下面是一个基于您的代码的示例,它将计时器设置为10秒,然后倒计时

    var end_time = new Date();
    end_time.setSeconds(end_time.getSeconds() + 10);
    
    function getTimeLeft() {
        var now = new Date();
        var seconds_left = (end_time - now) / 1000;
        if (seconds_left <= 1) {
            clearInterval(timerID);
        }
        var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
        $('#test-time-left').text(time_left);
    }
    timerID = setInterval(getTimeLeft, 1000);
    
    var end_time=新日期();
    end_time.setSeconds(end_time.getSeconds()+10);
    函数getTimeLeft(){
    var now=新日期();
    var seconds\u left=(结束时间-现在)/1000;
    
    如果(还剩的秒数)是等值和等类型?我想在用户关闭浏览器时使用,间隔将自动取消。使用
    interval应该可以,但日期会更改,但无论如何一切正常。谢谢。
    
    var end_time = new Date();
    end_time.setSeconds(end_time.getSeconds() + 10);
    
    function getTimeLeft() {
        var now = new Date();
        var seconds_left = (end_time - now) / 1000;
        if (seconds_left <= 1) {
            clearInterval(timerID);
        }
        var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
        $('#test-time-left').text(time_left);
    }
    timerID = setInterval(getTimeLeft, 1000);