[英]Time based javascript functions with setInterval
我正在使用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
的值,显然
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.