1

ハンドラーに次々と割り込みが入りますが、最後の割り込みから 5 ミリ秒が経過して割り込みが終了したことを示すまで、それらを処理したくありません。

私の考えではsetTimeout(LookAtInterrupts, 5)、ハンドラーが入力されるたびに呼び出すことでしたsetTimeout()が、その実行が発生する前に呼び出された場合、保留中のスケジュールされた呼び出しがキャンセルされることはドキュメントにはありません。

実際、それは何をするのでしょうか?ハンドラーが中断するたびに 5 ミリ秒後に呼び出されたくはありません。最後の割り込みだけです。

4

7 に答える 7

9

いいえ、そうではありません。保留中のタイムアウトはいくつでも設定できます。

この関数は、後でタイムアウトをキャンセルするために使用できるキーを返します。

var key = setTimeout( ... );

次に、後でキャンセルします。

clearTimeout(key);

期限切れのキーで呼び出しclearTimeout()てもエラーにはならないので、同期の問題について心配する必要はありません。

于 2013-10-02T20:02:43.030 に答える
2

setTimeoutそれ自体はリセットされません。

タイムアウトを手動でリセットできます

var timeout = setTimeout(...);
clearTimeout(timeout);
于 2013-10-02T20:02:42.717 に答える
1

AsetTimeout()は、以前のタイムアウトを暗黙的にキャンセルしません。

ただし、識別子を変数に格納し、毎回クリアすることでそれを実現できます。

var timeoutId = null;
var yourFn = function() { 
     clearTimeout(timeoutId);
     timeoutId = setTimeout(fn, 5);
};
于 2013-10-02T20:02:53.797 に答える
1

参照を保存する必要があります。setTimeout結果は保存して後でクリアできます。

「リセット可能」の場合setTimeout

// first assign it
var timeout = setTimeout(function(){
  foo();
}, 50);

// then look for an existing assignment before re-assinging
if (timeout) clearTimeout(timeout);
timeout = setTimeout(function(){
  bar();
}, 50);

参考文献:

余談ですが、タイムアウトを 5 ミリ秒未満に設定する場合は注意してください。HTML5 は 4 をサポートすることになっていますが、実際にそれに近い場所に到達しているとは思えません (タイムアウトのスピンアップのコストを考慮すると)。

于 2013-10-02T20:03:32.627 に答える
0

これを自分で実装することもできますが、より実用的な解決策は、underscore.js を取得してそのデバウンス機能を使用することです ( http://underscorejs.org/#debounceを参照)。

次に、次のことができます。

var lookAtInterrupts = _.debounce(handleInterrupt, 5);

結果として得られる関数は、多くても 5 ミリ秒ごとに 1 回だけ実行されます。

于 2013-10-02T20:06:40.413 に答える
0

setTimeout()実行されると、バインドされた への 1 つの呼び出しがスケジュールされますfunction()

キャンセルしたい場合は、ID を返して次のようsetTimeout()にクリアする必要があります。

var timeOutID = setTimeout( LookAtInterrupts, 5 );
(...)
clearTimeOut( timeOutID );
于 2013-10-02T20:06:40.990 に答える
0

その setTimeout 呼び出しへの参照を変数に格納し、割り込みが成功するたびに、タイムアウトを作成する前に、以前のタイムアウトをキャンセルします。

var tv = null;

function interrupt(){
    if(tv !== null){
        clearTimeout(tv);
    }
    tv = setTimeout(LookAtInterrupts,5)
}

function LookAtInterrupts(){

}

これにより、最後の割り込みのみが 5ms 間隔で実行を継続することが保証されます。それが明確だったことを願っています。

于 2013-10-02T20:03:52.753 に答える