ブラウザのJavaScriptはシングルスレッドであり(ここに関係しないWebワーカーを除く)、JavaScript実行の1つのスレッドは、別のスレッドが実行される前に完了するまで実行されるため、ステートメント:
while(flag==false) {}
が永久に実行される(またはブラウザが応答しないJavaScriptループについて不平を言うまで)と、ページがハングしたように見え、他のJavaScriptが実行される機会がないため、フラグの値を変更することはできません。
もう少し説明すると、JavaScriptはイベント駆動型言語ですです。つまり、制御をインタプリタに戻すまで、Javascriptを実行します。次に、JavaScriptがインタープリターに戻ったときのみ、イベントキューから次のイベントを取得して実行します。
タイマーやネットワークイベントなどのすべてのものは、イベントキューを介して実行されます。そのため、タイマーが起動したり、ネットワーク要求が届いたりしても、現在実行中のJavascriptが「中断」されることはありません。代わりに、イベントがJavaScriptイベントキューに入れられ、現在実行中のJavascriptが終了すると、次のイベントがイベントキューからプルされ、実行する順番が決まります。
したがって、などの無限ループを実行するwhile(flag==false) {}
と、現在実行中のJavascriptが終了しないため、次のイベントがイベントキューからプルされず、値flag
が変更されることはありません。ここで重要なのは、JavaScriptは割り込み駆動ではないということです。タイマーが起動しても、現在実行中のJavaScriptを中断せず、他のJavascriptを実行してから、現在実行中のJavaScriptを続行させます。イベントキューに入れられ、現在実行中のJavascriptが実行されて順番に実行されるまで待機します。
あなたがする必要があるのは、コードがどのように機能するかを再考し、flag
値が変化したときに実行したいコードをトリガーする別の方法を見つけることです。JavaScriptはイベント駆動型言語として設計されています。したがって、フラグを変更する可能性のあるイベントをリッスンして、そのイベントのフラグを調べるか、または独自のイベントをフラグを変更する可能性のあるコードや、フラグの値を変更するコードの一部が値をに変更するたびに、そのフラグを変更するコールバックをコールバック関数に実装できるコールバック関数を実装できます。true
これは、コールバック関数を呼び出し、コードを呼び出します。フラグが設定されたときに実行したいtrue
適切なタイミングで実行できるようになります。これは、ある種のタイマーを使用して常にフラグ値をチェックするよりもはるかに効率的です。
function codeThatMightChangeFlag(callback) {
// do a bunch of stuff
if (condition happens to change flag value) {
// call the callback to notify other code
callback();
}
}
jQuery.Deferred
、Q
、async
、...