2012-11-22 6 views
11

私は無限ループに終わる場合のために、フォールバックとしてタイマーを使いたいです。これは、設定間隔がこれを行う正しい方法だと思われます。しかし、それは私のために働いていない。javascript set intervalは別のスレッドとして実行されますか?

私の研究から、setIntervalはバックグラウンドで別のスレッドで実行する必要がありますが、表示されません。

この現象はなぜ発生しますか?そして私はこれをどのように解決するのですか?

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

答えて

10

ブラウザのJavaScriptは1つのスレッドで実行されます。だから、時間がかかりすぎるものを実行すると、ブラウザがフリーズします。

詳細について

を参照してくださいジョンResig氏の記事:http://ejohn.org/blog/how-javascript-timers-work/

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

4

zerkmsが正解です。しかし、私は、web workersがクライアント側のjavascriptからいくつかのマルチスレッド型の動作を取得する方法であると付け加えます。

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

ワーカーはバックグラウンドスレッドで実行され、メッセージを交換してイベントに登録することができます。それはかなり気の利いたものです。

+0

ウェブワーカーのリンクに感謝します。無限ループが終了するまで(= OPの問題を解決しない)、作業者からのメッセージが待たなければならないことを正しく読んでいますか? –

2

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

var start = Date.now(); 
while((Date.now() - start) < 5000){ 
    ... 
} 
関連する問題