基于时间的javascript函数与setInterval

时间:2013-10-06 13:43:43

标签: javascript node.js setinterval

我正在使用node.js,但这个问题与javascript有关。我正在与i2c板连接以淡化灯光,我想以特定的速率淡化它们,比如1秒钟。现在使用setInterval,理论上它应该像......如果我想在1秒钟内将它们淡化100步,我可以做类似......

var fader = setInterval(function(){
//will fade light 100 steps in 1 second
    doFade(something,something);
},10)

但是根据Interval循环内部的代码,它可能需要超过1秒(我测试过,我的应用程序大约需要2.5秒)。我确定函数doFade需要花费一定时间才能发生这个问题,但我很好奇是否有任何真正的方法可以让它实际上在1秒内完成。

1 个答案:

答案 0 :(得分:2)

你能得到的最接近的AFAIK完全依赖于JS会做这样的事情:

var fader = (function(now)
{
    var timeLeft, end = now + 1000,//aim for 1000 ms
        stepsRemaining = 100,
        callBack = function()
        {//define here, avoid redefining function objects
            doSomething(foo, bar);
            setter();
        },
        setter = function()
        {//recompute interval, set anew
            if (stepsRemaining <= 0)
            {//avoid infinite timeouts
                return;
            }
            timeLeft = (end - (+(new Date)));
            timeLeft= timeLeft > 0 ? timeLeft : 0;//ensure positive timeleft, if not, 0 intervals ==> ASAP
            fader = setInterval(
                callback,
                Math.floor(
                    timeLeft/stepsRemaining--
                )
            );
        };
    setter();
    return fader;
}(+(new Date)));//get ms now

此代码虽然未经测试,但会事先创建所有函数对象。然后,使用setter,每当间隔结束时,只要您没有设置100个间隔,就会计算新的间隔。完成工作后,通过callBack函数再次调用setter。在这里,检查剩余步数,然后再次计算timeLeft并根据剩余步骤计算,每次调用setter时减少1。 为了避免设置间隔太长或使用浮点数,我正在调用Math.floor,并且为了避免设置负超时值,我也正在检查timeLeft的值,显然