setInterval的持续时间

Hlushenok

我创建了一个简单的函数,该函数在3秒钟内将值从0计数到某个值。

这是小提琴-https: //jsfiddle.net/ar6akv5z/和代码段:

var number = document.querySelector('.number');
var button = document.querySelector('button');

button.addEventListener('click', function() {
    counting(number, 2500);
})

function counting(elem, value) {
 var count = 0;
 var timerId = setInterval(function() {
  if (++count == value) clearInterval(timerId);
  elem.innerHTML = count;
 }, 3000/value);
}
<span class="number">0</span>
<button>Go</button>

但是该功能的持续时间超过3秒。您能解释一下为什么会发生还是告诉我我的错误。

谢谢你,我的英语不好意思

TJ人群

计时器的最小间隔受HTML5规范(最初是在现已失效的计时器规范中)指定的算法的约束,以防止计时器触发得太快。当计时器安排计时器(本质上是setInterval这样)时,一旦嵌套达到5个,如果请求的计时器间隔小于4毫秒,则将其设置为4毫秒:

  1. 如果嵌套级别大于5,并且超时小于4,则将超时增加到4。

由于您要告诉它每次定时器启动时都加1,并且它很快就会开始启动(每4毫秒一次)(最好),因此需要4 * 2500 = 10000毫秒(10秒)才能完成。

您可以在下面的更新代码段中看到该平均延迟,该平均延迟将计数器替换为两次回调之间的平均时间:

if (!Date.now) {
  Date.now = function() {
    return +new Date();
  };
}
var number = document.querySelector('.number');
var button = document.querySelector('button');
var sum = 0;
var last = null;

button.addEventListener('click', function() {
    counting(number, 2500);
})

function counting(elem, value) {
 var count = 0;
  last = Date.now();
 var timerId = setInterval(function() {
   var now = Date.now();
   sum += now - last;
   last = now;
  if (++count == value) clearInterval(timerId);
  elem.innerHTML = sum / count;
 }, 3000/value);
}
<span class="number">0</span>
<button>Go</button>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章