2012-04-08 8 views

答えて

6

私はあなたが重い機能を実行していると仮定してsetIntervalと前の1つが完了していない場合は1つの目をスキップします。代わりに

function yourfoo() { 
    // code 
} 

setInterval(yourfoo, 3000); 

行うのその後

、:

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

setTimeout(yourfoo, 3000); 

これは、以前の1が完了するまで次の呼び出しが予定されていない保証します。

+0

1つのsetInterval型の呼び出された呼び出しは、呼び出し元のキューにすでに存在する場合は削除されることに注意してください。したがって、書き換えは、指定されたタイムアウトよりもコードの終了に時間がかかる場合に、コードをバックツーバックで実行したくない場合にのみ必要です。さもなければそれは重要ではない。いずれにしても、JavaScriptのシングルスレッドの性質のため、コードは同時に2回実行されることはありません。 – koenpeters

+0

は落とされず、単にキューに入れられました – Raynos

+0

その簡単な解決策!巨大な感謝 – Boos93

1

はい。

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

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

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

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

0

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

+0

それのための必要はありません。 2つの機能を同時に実行することはできません。このようなロック機構は必要ありません。 – Raynos

0

JavaScriptはシングルスレッドです。つまり、指定された時間に1ブロックのJavaScriptのみが実行されます。したがって、タイマーが起動しても、コードの実行は次の使用可能な瞬間まで待機します。重要なのは、setIntervalを1回だけ使用する場合は、「ファイア」がキューに入れられ、キューにこのタイプの間隔がなくなるまで他のすべてのキューが削除されることです。ここで

が、これはjQueryの父ジョンResig氏によってどのように動作するかの偉大な説明です:http://ejohn.org/blog/how-javascript-timers-work/

その方法は、あなたは、コードの実行を次のみ行われることを保証しているので、あなたは、setTimeoutメソッドを使用するようにコードを書き換えることができ少なくとも指定されたミリ秒数を待った後(実行がブロックされている場合はさらに多くなる可能性があります)。 setIntervalを使用すると、コードの終了に時間がかかる場合、ブロッキングによってコードのバックツーバック実行が発生する可能性があります。だから、

、バックツーバックの実行を防ぐために、このような何かを:

var nrOfMillisecondsToWait = 200; 
setTimeout(function() { 
    .. your code here 
}, nrOfMillisecondsToWait); 
関連する問題