6

Javascript の setInterval メソッドは、特定のコードの 2 回の実行の間に指定された間隔 (少なくとも) 待機しますか?それとも、前の実行の終了と次の実行の開始の間でその間隔を待機しますか?

(または、Javaのメソッドと比較すると、ScheduledExecutorServicesetIntervalは似ているscheduleAtFixedRate()か、むしろscheduleWithFixedDelay()そうですか?)

4

3 に答える 3

9

1000setIntervalミリ秒の間隔で呼び出し、コールバック コードの実行に100ミリ秒かかる場合、次のコールバックは900ミリ秒後に実行されます。

コールバックに1050ミリ秒かかる場合、最初のコールバックが終了した直後に次のコールバックが起動します ( 50ミリ秒の遅延があります)。この遅延は累積し続けます。

したがって、Java の世界では、これはscheduleAtFixedRate(). 動作が必要な場合は、終了するたびにコールバックscheduleWithFixedDelay()を使用して再スケジュールする必要があります。setTimeout()

function callback() {
    //long running code
    setTimeout(callback, 1000);
}
setTimeout(callback, 1000);

上記のコードcallback()は、実行にどれだけ時間がかかったとしても、終了後正確に 1000 ミリ秒待機してから再開します。

于 2012-07-10T07:20:28.673 に答える
1

この回答には、以下の jfriend00 のコメントからのヘルプが含まれています。

Javascript はシングル スレッドであるため、同じ関数を同時に 2 回実行することはできません。ただし、setInterval 遅延では、関数の実行にかかる時間が考慮されていません。

たとえば、setInterval 関数の実行に 500 ミリ秒かかり、遅延が 1000 ミリ秒だとします。これにより、関数が再び開始されるまでに 500 ミリ秒の遅延が発生します。

于 2012-07-10T07:19:21.337 に答える
0

このjsFiddleテストケースでわかるように、setIntervalは、間隔が設定されているよりも短い時間である限り、間隔で実行されるコードの所要時間に関係なく、間隔を時間どおりに維持しようとします。したがって、間隔を5秒に設定し、各間隔で実行されるコードに200ミリ秒かかる場合でも、各間隔は5秒間隔である必要があります(または、シングルスレッドのJavaScriptエンジンで5秒にできる限り近く)。

一方、javascriptはシングルスレッドであるため、各間隔で実行するコードの実行に間隔時間自体よりも長い時間がかかる場合、次の間隔は時間どおりに開始されず、最初の間隔の時間超過のために遅延します間隔のコード。

この作業テストケースでは、遅延時間を調整することで、これらの両方のケースを確認できます。

ここで動作するテストケース:http://jsfiddle.net/jfriend00/kGQsQ/

于 2012-07-10T07:36:59.080 に答える