6

これの専門用語が何なのかよくわかりません。インタラクティブなグラフィックを備えた GUI があります。ユーザーが GUI を操作した後、CPU を集中的に使用するアクションを実行する必要があります。ただし、ユーザー入力は非常に頻繁に行われるため、たとえば 1000 ミリ秒のユーザー入力がない場合にのみ関数を呼び出したいと考えています。私が使用するパターンの下:

scheduler = (function(){
    var timer;
    function exec(call, delay){
        clearTimeout(timer);
        timer = setTimeout(call, delay);
    };
    return exec;
})()

つまり、 の 3 つの呼び出しがschedulerそれぞれの直後に行われた場合、最後の呼び出しのみが実際に実行されます。

scheduler(function(){alert('foo')}, 1000);
scheduler(function(){alert('bar')}, 1000);
scheduler(function(){alert('zoo')}, 1000);

setTimeout動作しているように見えますが、少しハッキリしているように感じます Javascript の警告、特にスコープの問題について少し心配です。これは、より大規模に使用できる信頼できるパターンのように思えますか? 私が渡すインライン関数schedulerは、によって呼び出されたときに、通常どおりレキシカルスコープ内のすべてのオブジェクトを検索できるようになりますsettimeoutか? これらのスケジューラ インスタンスが複数ある場合はどうなりますか? それらは互いに干渉できますか?これを達成する別の方法はありますか?

4

4 に答える 4

1

理論的には、ソリューションは機能するように見えます。関数にコールバック関数を渡すことに関連するスコープの問題はありませんscheduler。コールバックは、JavaScript の他の関数と同様に、それが作成された環境に関係なく終了します。そうは言っても、スコープ ルールは JavaScript では少しトリッキーになる可能性があるため、よく読んでください。

setTimeout実際には、このソリューションが機能しなくなる可能性があることに関連するブラウザー固有の問題がいくつかある可能性があります。たとえば、特定のブラウザーがsetTimeoutコールバックを実行する頻度が異なる場合があるため、コールバックが実行されるまでの待機時間が予想より長くなることがあります。すべてのsetTimeoutコールバックは順次実行されます。並行して実行されることはありません。ただし、それらがどの順序で実行されるかについては保証があります。

そうは言っても、ソリューションの主要な落とし穴は、コールバックを登録する方法ではなく、登録するコールバックに関係している可能性があります。

于 2012-12-21T22:02:36.330 に答える
1

代わりに Web ワーカー スレッドの使用を選択できます。

https://developer.mozilla.org/en-US/docs/DOM/Using_web_workers http://www.html5rocks.com/en/tutorials/workers/basics/

于 2012-12-21T21:51:26.187 に答える
1

underscore.jsのdebounce 関数はまさにこれを行います。

デバウンス _.debounce(function, wait, [immediate])

渡された関数の新しいデバウンスされたバージョンを作成して返します。この関数は、最後に呼び出されてから待機ミリ秒が経過するまで実行を延期します。入力が到着しなくなった後にのみ発生するはずの動作を実装するのに役立ちます。たとえば、Markdown コメントのプレビューのレンダリング、ウィンドウのサイズ変更が停止した後のレイアウトの再計算などです。

于 2013-02-11T02:23:38.860 に答える