代码之家  ›  专栏  ›  技术社区  ›  Andrew Harris

当我需要时间间隔非常精确时,有比setInterval更好的解决方案吗?

  •  1
  • Andrew Harris  · 技术社区  · 9 年前

    但我一直在读setInterval如何受到漂移的影响,可能不是很准确。对于一首持续3-4分钟且需要100毫秒精度的歌曲(如果计时机制稍微有点不对劲,这可能会让用户非常沮丧),这似乎不是最好的解决方案。

    那么有更精确的替代方案吗?T

    4 回复  |  直到 9 年前
        1
  •  1
  •   PressingOnAlways    9 年前

    在绝对时间内计算一切可能是一个更好的主意。所以,有一个 var starttime = Date.now(); var expected_note_time = starttime+beat_interval*beat_number abs(time_pressed-expected_note_time) < ALLOWED_MISTAKE_VARIANCE ,然后将该点添加到用户的分数中。祝你好运

        2
  •  1
  •   Emad Dehnavi    9 年前

    同意,setInterval有一些问题,比如它不关心回调是否仍在运行,并且不够灵活。

    您可以实现自己的方法,例如:

    function interval(func, wait, times){
    var interv = function(w, t){
        return function(){
            if(typeof t === "undefined" || t-- > 0){
                setTimeout(interv, w);
                try{
                    func.call(null);
                }
                catch(e){
                    t = 0;
                    throw e.toString();
                }
            }
        };
    }(wait, times);
    
    setTimeout(interv, wait);
    };
    

    该函数有一个名为interv的内部函数,该函数通过setTimeout自动调用,interv内是一个闭包,用于检查重复时间、调用回调并通过setTimeout再次调用interv。如果回调调用中出现异常,则间隔调用将停止,并引发异常。

    您可以这样使用它:

    interval(function(){
        // Code block goes here
    }, 1000, 10);
    

    它以间隔或10秒的时间执行一段代码5次,您可以在其间执行一些操作。

        3
  •  0
  •   frattaro    9 年前

    返回自1970年1月1日起的毫秒数:

    var d = new Date();
    var n = d.getTime();
    

    n的结果可能是: 1502156888172

    发件人: https://www.w3schools.com/jsref/jsref_gettime.asp

        4
  •  0
  •   Alexandre Senges    9 年前

    需要100ms的精度

    setInterval()函数将因javascript的构建方式(事件循环)而漂移,如果您用大量CPU密集型任务阻塞它,它将延迟。但是,如果正确执行,漂移将非常小(小于毫秒)。

    避免这种情况的一个好方法是使用多线程,但这在JavaScript中不容易实现。