13

無限ループに陥った場合に備えて、タイマーをフォールバックとして使用したいと考えています。これを行うには、間隔を設定するのが正しい方法のようです。しかし、それは私にとってはうまくいきません。

私の調査によると、 setInterval はバックグラウンドで別のスレッドで実行する必要があるようですが、表示されません。

なぜこのような動作が発生するのですか? そして、どうすればこれを解決できますか?

var time = 0;
window.setInterval(function(){time++;}, 1000);
while (true) {
    //stuff done
    if (time >= 5) {
        break;
    }
}
4

3 に答える 3

11

ブラウザの JavaScript はシングル スレッドで実行されます。そのため、時間がかかりすぎる何かを実行すると、ブラウザーがフリーズします。

詳細については、John Resig の記事を参照してください: http://ejohn.org/blog/how-javascript-timers-work/

この記事を読んだsetInterval後は、現在のコードが終了した後でのみ、コールバックが 1000 ミリ秒後に実行されるようにキューに入れられていることがわかります。ただし、無限ループのため、終了できません。

于 2012-11-22T01:51:17.977 に答える
4

zerkmsは正しい答えを持っています。ただし、 Web ワーカーは、クライアント側の JavaScript からマルチスレッドのような動作を取得する方法であると付け加えておきます。

var worker = new Worker('my_task.js');
worker.onmessage = function(event) {
 console.log("Called back by the worker!\n");
};

ワーカーはバックグラウンド スレッドで実行され、メッセージを交換したり、イベントをサブスクライブしたりできます。それはかなり気の利いたです。

于 2012-11-22T01:56:09.093 に答える
2

すでに述べたようにsetInterval、無限ループが終了するまでコールバックは実行されません。Web ワーカーを使用せずに、達成しようとしていることを実行するには、ループ自体から時間を確認する必要があります。

var start = Date.now();
while((Date.now() - start) < 5000){
  ...
}
于 2012-11-22T01:58:15.483 に答える