setInterval比连续的setTimeout调用更容易按时发生

时间:2014-09-19 07:40:00

标签: javascript

我有这些代码片段做同样的事情,但使用不同的方法 - setInterval和连续的setTimeout调用:

function log() {
  console.log('fn')
}

//option 1
var forTimes = 10;
var doneTimes = 0;

var interval = setInterval(function(){
  if (doneTimes < forTimes) {
    log();
    doneTimes++;
  } else {
    clearInterval(interval);
  }
}, 100);

//option 2
function timeoutFn() {
  if (doneTimes < forTimes) {
    log();
    doneTimes++;
    setTimeout(timeoutFn, 100);
  }
}
setTimeout(timeoutFn, 100);

由于单线程javascript的性质,setTimeoutsetInterval都不能保证函数调用100毫秒,因为线程可能忙于运行事件处理程序或进行重排/重绘。我想知道他们中是否有人在指定时间内执行处理程序的可能性更大?如果是这样,为什么? setInterval是否像setTimeout一样,它等待指定的时间间隔传递,并且只有在此之后才将队列添加到队列中?

1 个答案:

答案 0 :(得分:2)

setInterval现在被认为是一种不好的做法,因为无论先前对该函数的调用是否已完成,都会有一个间隔执行的函数。

关于确切的时间,既不好也不坏。

最好的方法是做一个递归的setTimeout模式:

var count = 0;
(function loopsiloop(){
   setTimeout(function(){
      if(count < 10) {
         loopsiloop();
      }

      ++count;
   }, 100);
})();