1

我正在使用 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 秒内发生。

4

1 回答 1

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 并基于剩余步数,每次调用时减 1 setter
为了避免将间隔设置得太长或使用浮点数,我正在调用Math.floor,并且为了避免设置负超时值,我timeLeft显然也在检查 的值

于 2013-10-06T14:04:23.460 回答