2011-01-28 7 views
0

私はcheckStatus(x)という関数を持っています。ここでxはIdです。この関数をn回非同期に呼び出す方法はありますか?完了するために互いに依存することなく、別のものを開始することなく?私はjqueryのにjqueryで非同期呼び出しを行う

EDIT使用してい

は、私は正しい用語を使用する場合はわからないんだけど、ここで私が欲しいものです。私はIDのリストを持っていて、リストを反復するので、IDごとにこの関数を実行したい。

しかし、私は1人のIDがフィンランド人になるのを待ってから、別のIDでこの関数を実行することは望ましくありません。この機能を同時に実行することは可能ですか?

+0

を?ページの読み込み?タイマーを設定し、それをいくつかのイベントにバインドします。 – Hannes

答えて

5

Javascriptエンジンはシングルスレッドであり、一度に1つのコードしか実行されません。非同期機能(AJAX、timeouts/intervals)により、異なるコードブロックが並行して実行されることはありません(つまり、Javascriptでは複数のプロセッサコアを使用することはありません)。

非同期(非ブロッキング)コードを生成する最も簡単な方法は、setTimeoutI 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); 
    } 
} 
+0

私はあなたの説明が好きです。例を挙げることができますか、setTimeoutをsetIntervalに置き換えると、Odedの例は大丈夫ですか? – London

+0

@ロンドン - 確かに、私たちは本当に素早く盛り上げましょう。 :-) –

+0

ああああ。私はちょうど...困惑しています。 –

1

setTimeoutまたはsetInterval機能を使用してください。

setTimeout(function(){checkStatus(x);}, 100); 
setTimeout(function(){checkStatus(x);}, 200); 
setTimeout(function(){checkStatus(x);}, 300); 
関連する問題