並行処理 - JavaScriptの設定間隔は別のスレッドとして実行されますか?



重い処理 非同期 (4)

ブラウザのJavaScriptはシングルスレッドで動作します。 あなたがあまりにも長い時間がかかる何かを実行するならばそれで - それはブラウザを凍らせるでしょう。

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

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

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

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

なぜこのような行動が起きているのですか? そして、どうやってこれを解決できますか?

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

zerkmsは正しい答えを持っています。 しかし、 Webワーカーは、クライアントサイドのJavaScriptからマルチスレッド風の動作を得るための手段であると付け加えます。

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

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


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

var start = Date.now();
while((Date.now() - start) < 5000){
  ...
}

あなたが醜い-1のチェックを書くための代替手段を探していたならば、代わりにチルダを前に付けます。

if (~haystack.indexOf('needle')) alert('found');

Joe Zimmerman - 〜を使用すると-1が0に変換されることがわかります。数字の0は偽の値です。つまり、ブール値に変換されたときにfalseと評価されます。 最初は大きな見識のようには思えませんでしたが、indexOfのような関数はクエリが見つからないときに-1を返します。 つまり、これに似たものを書くのではなく、

if (someStr.indexOf("a") >= 0) {
  // Found it
} else  {
  // Not Found
}

あなたのコードの文字数を減らすことができますので、次のように書くことができます:

if (~someStr.indexOf("a")) {
  // Found it
} else  {
  // Not Found
}

詳細はこちら





javascript