2016-08-16 38 views
-1

setTimeoutを使用して外部入力が到着するのを待つ(最大変数を使用)か、または最大しきい値時間待つか、終了します。setTimeoutの内部で呼び出された関数が呼び出されていません

ここでは、コードです:

var MAX_WAIT_THRESHOLD = 5000; 
var keepWaiting = true; 
var waitInterval = 500; 
var totalTimeWaited = 0; 

alert("Alert1"); 

while(keepWaiting == true) { 
    setTimeout(function() { 
    totalTimeWaited = totalTimeWaited + waitInterval; 
    alert("Alert2"); 
    if(responseReceived == true || totalTimeWaited >= MAX_WAIT_THRESHOLD) { 
     keepWaiting = false; 
    } 
    }, waitInterval); 
} 

問題は、実際に何らかの理由setTimeout(..)のためになることはありませんその中に作成された匿名関数を呼び出しますが。私は、ChromeのJavaScript実行コントロールにブレークポイントを設定してこれを確認しましたが、実際には無名関数内に配置されたブレークポイントで実行が停止することはありません。 JavaScriptの実行は、while ..行とsetTimout(..)行の間でトグルし続けます。 responseReceivedはコード内の他の場所に設定されています。これを言う別の方法は、最初のアラートが(アラート1)を表示し、2番目のアラートが表示されないことです(アラート2)。

私は間違っていますか?

EDIT:

私は報告「複製」質問を通り抜けたが、私はそれは私の質問に関連しているかを確認することができません。私の質問はループwhileに関するものではありません。内部匿名関数が呼び出されていない理由です。

+2

[Javascript - waiting to flag = true](http://stackoverflow.com/questions/22125865/javascript-wait-until-flag-true) –

+0

この質問がどのように接続されているかわかりません私が求めているもの。私はJavaScriptがシングルスレッドであることを知っています。問題は 'while'ループではありません。問題は、何らかの理由で内部無名関数が呼び出されないということです。 – Ahmad

+2

これは、 'while'ループは決して終了しないので、あなたのタイマーはチャンスを得ることはありません(シングルスレッド)。 –

答えて

1

コードが私のブラウザタブを強制終了しました。 :D

なぜsetIntervalを使用して、whileループを取り除いてみませんか?

var MAX_WAIT_THRESHOLD = 5000; 
var waitInterval = 500; 
var totalTimeWaited = 0; 
var waiting = true; 

alert("Alert1"); 

var interval = setInterval(function() { 
    totalTimeWaited += waitInterval; 
    alert("Alert2"); 
    if (responseReceived || totalTimeWaited >= MAX_WAIT_THRESHOLD) { 
    // stop waiting 
    clearInterval(interval); 
    waiting = false; 
    alert("Done"); 
    } 
}, waitInterval); 
0

この問題はjavascript concurrency modelと関連しています。

私の知る限り、あなたのすべてのsetTimeoutコールバックはwhileループが終了した後にのみ実行できます。whileループはキューをブロックするメッセージなのでです。しかし、この場合、それは決して終わりません。これを説明する別のSOスレッドがありましたが、私は今それを見つけることができません。

実際には、制御変数を使ってループの最大時間を制御しています。しかし、このコントロールコードはsetTimeoutコールバックの内部にあるので、ループが終了するまでキューにプッシュされないので、ループ内でvar keepWaitingコントロールが決してfalseにならないようにします。あなたがsetTimeout関数外の制御コードを取る必要があり、それはfact-で、ブラウザを壊さないだろうし、いくつかの時点で「alert2」というメッセージ-several回が表示されます:

var MAX_WAIT_THRESHOLD = 5000; 
var keepWaiting = true; 
var waitInterval = 500; 
var totalTimeWaited = 0; 
var responseReceived = false; 

console.log("Alert1"); 

while(keepWaiting == true) { 
setTimeout(function() { 

console.log("Alert2"); 

}, waitInterval); 

    totalTimeWaited = totalTimeWaited + waitInterval; 
    if(responseReceived == true || totalTimeWaited >= MAX_WAIT_THRESHOLD) { 
    keepWaiting = false; 
    } 
} 

をただし、すべてのコールバックはなります以前に公開された理由のために最後に発砲する。

setTimeoutsの永遠のループが必要な場合は、繰り返しの代わりに再帰を使用します。

関連する問題