2017-03-28 4 views
2

何らかのイベントの結果として永久にコールバックが発生したとします。すなわち、誰かがマウスを動かす。JavaScriptでx秒間に呼び出されなかった場合に実行する

コールバックがx秒で発生していない場合は、クリーンアップアクションを実行したいと思います。すなわち、マウスを2秒以内に動かさなかった場合、発射する。

私はおそらくsetTimeoutで何かを修正することができたと思いますが、標準ライブラリにこれ用の関数があるのでしょうか?一種の「デッドマンズスイッチ」は、標準的な方法があればよくあるようです。そうでない場合、私は1つを作っている。誰でも?

+2

デバウンスの実装を調べます。別の目的を果たす一方で、主な実装は ':: after'フックを提供するために簡単に変更することができます。 – ste2425

+0

De-bounceはまさに私が探しているものです。 Lodashとアンダースコアは実装されており、おそらく他のライブラリもそうです。これは正解です。これを回答フィールドにコピーする場合は、正解とマークします。他のユーザーがすばやく参照できるように、一般的な実装(例:Lodash)へのリンクを含めることもできます。 – pixelpax

答えて

1

デバウンスが助ける技術かもしれません。

本質的に、デバッグされたバージョンが呼び出される頻度に関係なく、ラップされた関数がいつ実行されるかを制御できるように関数をラップする方法です。

これは、ウィンドウのサイズ変更などのイベントで最も一般的に使用されます。その後、ユーザがを完了した後でのみ、ハンドラを実行することができます。ウィンドウのサイズを変更している間ではなく、ウィンドウのサイズを変更します。

スロットリングもありますが、これは似ていますが重要な違いがあります。

抑制機能は、n時間呼び出されなかった後に実行されるデバウンスバージョンではなく、n時間ごとに1回実行されます。

underscoreおよびlodashには、バウンスおよびスロットリングの実装があります。

しかし、それは達成するのはかなり簡単で、まだ使用されていなければ大きなライブラリは本当に必要ありません。

+0

ありがとう、 ste2425!非常に便利で簡潔です。 – pixelpax

1

あなたはsetTimeoutについて正しい方向にいると思います。あなたの驚きごとに、私はそれを行うモジュールを認識していません。そして、このプロセスの侵害的性質のために、それは理にかなっています。

このカントーを行うことができます:

var yourmodule; //assuming you're using a module to store your app code; the object should obviously exist before continuing 
yourmodule.cleanupSequenceId = -1; 

function yourEventCallback() { 
    if (yourmodule.cleanupSequenceId !== -1) clearTimeout(yourmodule.cleanupSequenceId); 

    //function logic 

    //cleanup: 
    yourmodule.cleanupSequenceId = setTimeout(cleanupMethod, 2000); 
} 
+0

存在しないタイムアウトをクリアすることは安全です。したがって、クリアする前に-1でないことを確認する必要はありません。 (https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/clearTimeout - 「無効なIDをclearTimeout()に渡すと何も起こりません;例外はスローされません」 –

関連する問題