1

以下のコードがあります(注:後でループにコードを追加しますが、最初にこれを機能させる必要があります):

var calls_on = true;
function hunt(max, ext, duration){
    if(duration != '0' || duration != false || duration != 0){
        duration = duration * 1000; // milliseconds to delay before stopping calls
        var t=setTimeout(function(){calls_on=false;}, duration);
    }
    while(calls_on){
        alert('reached');
    }
    alert('test');
}

'duration'条件が実行され、タイムアウトハンドルが設定されていることを確認しました。ただし、このループが終了することはなく、setTimeoutコールバックが実行されることもありません。ループを完全に削除すると、正常に機能します(これにより、関数内の唯一のコードになります)。

どんな助けでもいただければ幸いです。setTimeoutはどういうわけか範囲外ですか?ループはどのようにタイムアウトを狂わせていますか?

4

2 に答える 2

7

JavaScript はシングルスレッドです。コードがループに陥っている限り、タイムアウトは決して実行されません。

タイムアウトが完了することに依存するものはすべて、タイムアウト内にある必要があります。

于 2013-02-19T21:11:34.027 に答える
5

イベントベースのプログラミングから: 非同期が同期よりも優れているもの

興味深いことに、ブロック内の残りのコードがすべて実行されるまで、タイムアウトは実行されません。そのため、タイムアウトが設定されていて、実行時間の長い関数が実行された場合、実行時間の長い関数が終了するまでタイムアウトは開始されません。実際には、setTimeout や setInterval などの非同期関数は、イベント ループと呼ばれるキューにプッシュされます。

したがって、その後に無限ループがあるため、setTimeout実行されることはありません。

于 2013-02-19T21:14:55.010 に答える