違いはありますか?
はい。Timeoutは、setTimeout()が呼び出されてから一定時間実行されます。間隔は、前の間隔が発生した後、一定時間実行されます。
doStuff()関数の実行に時間がかかる場合は、違いがわかります。たとえば、setTimeout / setIntervalへの呼び出しを.
で、タイムアウト/インターバルの起動をで、*
JavaScriptコードの実行をで表すと[-----]
、タイムラインは次のようになります。
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
次の問題は、JavaScriptがすでに何かをしている(前の間隔の処理など)ときにビジー状態になった場合です。この場合、間隔は記憶され、前のハンドラーが終了して制御をブラウザーに返すとすぐに発生します。たとえば、doStuff()プロセスの場合、短い([-])場合と長い([-----])場合があります。
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
•すぐにコードを実行できず、代わりに保留にされたインターバルファイアリングを表します。
したがって、間隔はスケジュールに戻るために「追いつく」ことを試みます。しかし、それらは互いの上に1つをキューに入れません。間隔ごとに保留中の実行は1つだけです。(すべてがキューに入れられた場合、ブラウザーには未解決の実行のリストが増え続けます!)
. * • • x • • x
[------][------][------][------]
xは、実行できなかった、または保留にできなかったインターバルファイアリングを表すため、代わりに破棄されました。
doStuff()関数の実行に、設定された間隔よりも長い時間がかかる場合、ブラウザーはそれを処理しようとして100%のCPUを消費し、応答が遅くなる可能性があります。
どちらを使用しますか、またその理由は何ですか。
Chained-Timeoutは、ブラウザに空き時間のスロットを保証します。Intervalは、ブラウザーUIの可用性を犠牲にして、実行されている関数がスケジュールされた時間に可能な限り近く実行されるようにします。
チェーンタイムアウトは、ページが読み込まれている間常に発生する進行中のアニメーションに対してより丁寧ですが、できるだけスムーズにしたい1回限りのアニメーションの間隔を検討します。それほど要求されない使用法(30秒ごとに起動する簡単なアップデーターなど)では、どちらでも安全に使用できます。
ブラウザーの互換性の点では、setTimeoutはsetIntervalよりも前のバージョンですが、今日出会うすべてのブラウザーが両方をサポートします。長年の最後の悩みの種は、WinMo <6.5のIE Mobileでしたが、うまくいけば、それも今私たちの後ろにあります。