簡體   English   中英

使用setInterval的基於時間的javascript函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM