javascript - 防止JS定时器溢出

标签 javascript ruby-on-rails countdowntimer

我已经做了一个定时器 this问题得票最多的答案。 问题是,当它达到 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,我想了两种解决方法。

首先(恕我直言更好)将在 while 循环中给出 setInterval(getTimeLeft, 1000); ,条件为 seconds_left >= 0。但我对此没有什么问题。

  1. 我不知道如何在函数外部传递变量。

  2. 我不知道阻止 setInterval 是否会起到任何作用,但我不妨将间隔设置为 0(因此将其关闭)。

第二种方法就是简单地在函数内部执行 while :

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

问题:

  1. 浪费资源,因为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);

我还将 Seconds_left 设置为 0,以防脚本错过 0 秒帧(例如用户在倒计时发生时关闭浏览器)。

最佳答案

假设您想在 seconds_left 等于 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 循环的想法将行不通:

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

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

关于javascript - 防止JS定时器溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42303211/

相关文章:

javascript - 为什么我的innerHTML会覆盖父类的样式属性?我该如何解决这个问题?

ruby-on-rails - 在带有 Ruby on Rails 的 PostgreSQL 中使用间隔

ruby-on-rails - 内存中具有相同 ID 的更多对象?

ruby-on-rails - Rails 关联 primary_key 选项

java - 在 AsyncTask 中运行 CountDownTimer 会抛出 java.lang.RuntimeException - Looper.prepare()

javascript - (SystemJS)XHR错误@ angular/commobundles/common.umd.js/http未找到

javascript - 通过 JavaScript 设置表单目标

java - 我该如何修复此代码,以便我的 android textview 使用倒计时器更新并显示剩余的秒数?

java - 带处理程序的顺序倒计时器将无法正确更新 textView

javascript - 检查值是否在数组内