用于使用setTimeout或RAF无法实现的setInterval?

时间:2016-06-20 19:57:59

标签: javascript setinterval

我正在努力想到需要使用setInterval的Web应用程序开发中的用例。

"危险" setInterval只要在分配的时间间隔内没有完成回调就会排队。

此外,setInterval的行为可以使用setTimeoutrequestAnimationFrame进行模拟,但不会出现此问题"危险"。

鉴于此,有人可以向我提供一个用例setInterval是优越/更合适的选项吗?

修改

以为我记下了我的发现。

setInterval是一种以偶数间隔运行的简单方法。间隔将主要非常准确,但如果事件循环被阻止,那么它们可能完全不准确。



var x = 0;
setInterval(function() { 
   waitBlocking(5000);
   document.write(x++);
},100);

function waitBlocking(ms) {
    var start = Date.now();
    while((Date.now() - start) < ms) {}
}
&#13;
&#13;
&#13;

据我所知,如果你想要均匀扩展的间隔回调调用(见上文),setInterval是有用的,但如果你想要一个方便的方法在一个时期内有一个特定数量的回调调用,在时间范围内尽可能接近它们应该运行的时间。这似乎是一个相当狭窄的用例。

我确定我错过了什么。

编辑2:

这基本上是JS可以实现的时钟的最佳近似值,所以我猜setInterval是&#34;时钟计时器&#34;。据推测,这在需要简单时钟的应用中很有用。

1 个答案:

答案 0 :(得分:1)

适合setTnterval的用例是您希望在准确时间执行函数的时间。 setIntervalsetTimeout有字幕差异。 setInterval从事件setInterval解雇之后的延迟开始后执行该函数。 setInterval也不是隐居的,所以不用担心关闭和内存泄漏。但是,可以找到更多详细信息here

以下是典型setInterval函数的代码

var intervalID = window.setInterval(myCallback, 500);

function myCallback() {
  // Your code here
}

如果要使用setTimeout实现相同的功能,则必须创建一个可以创建闭包的递归,然后出现内存泄漏问题,如下所示。

function startTimer() {   
    var count = [1,2,3,4,5,6,7,8,9,0]
    setTimeout(function() {
        //do some stuff
        count.push(100);//you have just create a closure 
        //and all the problems that is associated with it
        startTimer();//this is where the recursion happens 
    }, 1000);
}