Javascript の setInterval メソッドは、特定のコードの 2 回の実行の間に指定された間隔 (少なくとも) 待機しますか?それとも、前の実行の終了と次の実行の開始の間でその間隔を待機しますか?
(または、Javaのメソッドと比較すると、ScheduledExecutorService
setIntervalは似ているscheduleAtFixedRate()
か、むしろscheduleWithFixedDelay()
そうですか?)
Javascript の setInterval メソッドは、特定のコードの 2 回の実行の間に指定された間隔 (少なくとも) 待機しますか?それとも、前の実行の終了と次の実行の開始の間でその間隔を待機しますか?
(または、Javaのメソッドと比較すると、ScheduledExecutorService
setIntervalは似ているscheduleAtFixedRate()
か、むしろscheduleWithFixedDelay()
そうですか?)
1000setInterval
ミリ秒の間隔で呼び出し、コールバック コードの実行に100ミリ秒かかる場合、次のコールバックは900ミリ秒後に実行されます。
コールバックに1050ミリ秒かかる場合、最初のコールバックが終了した直後に次のコールバックが起動します ( 50ミリ秒の遅延があります)。この遅延は累積し続けます。
したがって、Java の世界では、これはscheduleAtFixedRate()
. 動作が必要な場合は、終了するたびにコールバックscheduleWithFixedDelay()
を使用して再スケジュールする必要があります。setTimeout()
function callback() {
//long running code
setTimeout(callback, 1000);
}
setTimeout(callback, 1000);
上記のコードcallback()
は、実行にどれだけ時間がかかったとしても、終了後正確に 1000 ミリ秒待機してから再開します。
この回答には、以下の jfriend00 のコメントからのヘルプが含まれています。
Javascript はシングル スレッドであるため、同じ関数を同時に 2 回実行することはできません。ただし、setInterval 遅延では、関数の実行にかかる時間が考慮されていません。
たとえば、setInterval 関数の実行に 500 ミリ秒かかり、遅延が 1000 ミリ秒だとします。これにより、関数が再び開始されるまでに 500 ミリ秒の遅延が発生します。
このjsFiddleテストケースでわかるように、setIntervalは、間隔が設定されているよりも短い時間である限り、間隔で実行されるコードの所要時間に関係なく、間隔を時間どおりに維持しようとします。したがって、間隔を5秒に設定し、各間隔で実行されるコードに200ミリ秒かかる場合でも、各間隔は5秒間隔である必要があります(または、シングルスレッドのJavaScriptエンジンで5秒にできる限り近く)。
一方、javascriptはシングルスレッドであるため、各間隔で実行するコードの実行に間隔時間自体よりも長い時間がかかる場合、次の間隔は時間どおりに開始されず、最初の間隔の時間超過のために遅延します間隔のコード。
この作業テストケースでは、遅延時間を調整することで、これらの両方のケースを確認できます。
ここで動作するテストケース:http://jsfiddle.net/jfriend00/kGQsQ/