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

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


但是根据Interval循环中的代码,可能要花费1秒以上的时间(我测试过,对于我的应用程序大约是2.5秒)。我敢肯定,函数doFade需要花费一定的时间才能导致此问题,但我只是想知道是否有任何真正的方法可以使这些事情在一秒钟之内全部发生。

最佳答案

完全依靠JS获得的最接近的AFAIK就是这样的:

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的值。

关于javascript - 使用setInterval的基于时间的javascript函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19209532/

10-12 05:27