3

3 秒ごとに実行される JavaScript 関数があります。関数の前のインスタンスが既に実行されている場合、何もしない方法はありますか?

4

4 に答える 4

10

で重い関数を実行していsetIntervalて、前のティックが完了していない場合は1ティックをスキップしたいとします。

次に、代わりに

function yourfoo() {
   // code
}

setInterval(yourfoo, 3000);

行う:

function yourfoo() {
   // code
   setTimeout(yourfoo, 3000);
}

setTimeout(yourfoo, 3000);

これにより、前の呼び出しが完了するまで次の呼び出しがスケジュールされないことが保証されます。

于 2012-04-08T10:55:32.970 に答える
0

ブールフラグを定義して、より高いスコープでの関数の実行状態を示し、それに応じてオンまたはオフに切り替えることができます。

于 2012-04-08T10:59:20.153 に答える
0

はい。

これはデフォルトで行われます。

JavaScript はシングル スレッドと呼ばれます。

2 つの機能を同時に実行することはできません。

おそらくsetInterval、現在実行中のコードが終了するまで関数呼び出しを内部的にバッファリングします。

于 2012-04-08T10:54:46.247 に答える
0

JavaScript はシングル スレッドです。つまり、特定の時間に実行される JavaScript のブロックは 1 つだけです。そのため、タイマーが起動しても、コードの実行は次の利用可能な瞬間までキューに入れられます。知っておくべき重要なことは、setInterval を使用している場合、1 つのインターバル「発火」だけがキューに入れられ、このタイプのインターバルがキューになくなるまで、他のすべてのインターバルはドロップされるということです。

これがどのように機能するかについて、jQuery の父 John Resig による優れた説明があります: http://ejohn.org/blog/how-javascript-timers-work/

setTimeout を使用するようにコードを書き直すことができます。これにより、コードの次の実行が、少なくとも指定されたミリ秒数 (実行がブロックされている場合はそれ以上になる可能性があります) 待機した後にのみ行われることが保証されるためです。setInterval を使用すると、コードの終了に時間がかかる場合、ブロッキングによってコードが連続して実行される可能性があります。

したがって、次のようにして、連続実行を防止します。

var nrOfMillisecondsToWait = 200;
setTimeout(function() {
  .. your code here
}, nrOfMillisecondsToWait);
于 2012-04-08T11:25:18.357 に答える