Javascriptエンジンはシングルスレッドであり、一度に1つのコードしか実行されません。非同期機能(AJAX、timeouts/intervals)により、異なるコードブロックが並行して実行されることはありません(つまり、Javascriptでは複数のプロセッサコアを使用することはありません)。
非同期(非ブロッキング)コードを生成する最も簡単な方法は、setTimeout
(I strongly discourage using setInterval
)を使用していますが、これは他にも示唆されていますが、パフォーマンス上の利点はありません。これは、ブラウザの他のタスク(ページの再描画やユーザー入力など)が実行できるようにすることで、遅いJS計算中にブラウザが「ハング」しないことを保証します。実際には、これらの計算の速度は向上しません(実際には、タイムアウトの追加オーバーヘッドが小さいため、実際には速度が若干低下します)。
それははweb workersを使ってJavaScriptで別のスレッドを作成することが可能ですが、その機能は制限されている(例えば、彼らはDOMを変更することはできません)とthey are not yet supported by IE。
「再帰」setTimeout
呼び出し使用して長時間実行、非ブロックタスクの例:非同期的にどのように
function getStarted(elements) {
// this function must be inside the outer function
// so that `i` (below) can be accessed via a closure
function processElement() {
// do work on elements[i] here
// or pass it to another function
// this continues only if we haven't hit the end of the array,
// like the second and third clauses of a `for` loop
if (++i < elements.length) {
setTimeout(processElement, 0);
}
}
// don't bother with empty arrays
if (elements.length) {
// the same `i` is used each time processElement runs
// and acts just like a `for` loop index
var i = 0;
// optional: make a copy of the array so that it
// doesn't get modified while we're working
elements = elements.slice();
// even a zero-millisecond "delay" gives the browser the
// opportunity to run other code
setTimeout(processElement, 0);
}
}
を?ページの読み込み?タイマーを設定し、それをいくつかのイベントにバインドします。 – Hannes