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

あなたが得る最も近いものは、知る限り、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 に答える