我正在使用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秒内完成。
答案 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
的值,显然