2011-07-27 28 views
3

JavaScriptを使用して一連の作業をディスパッチして、ブラウザが応答しやすくなるようにブラウザで実行できるようにしたいと考えています。JavaScript setTimeoutが実行されたかどうかを確認する

私が取ろうとしているアプローチは、各チャンクをsetTimeout(func, 0)コールでキューに入れられた関数に渡すことです。

すべての作業が完了した時点を知る必要があるため、返されたタイマーIDをマップに格納します(id - > true | false)。このマッピングは、タイマーIDを取得した後、次のコードブロックでfalseに設定され、キューに登録された関数は完了時にマッピングをtrueに設定します。ただし、キューに登録された関数はそのタイマーIDを認識しません。

もっと良い/簡単な方法があるかもしれません。また、必要に応じて地図をどのように操作できるかについてのアドバイスもありますか?

答えて

6

私は配列に作業をキューイングし、キューを処理するためにタイムアウトを使用し、キューが空になるとコールバックを呼び出します。ような何か:ブラウザでJavaScriptなど

var work = [...]; 

var run = function(work, callback) { 
    setTimeout(function() { 
     if(work.length > 0) { 
      process(work.shift()); 
      setTimeout(arguments.callee, 25); 
     } 
     else { 
      callback(); 
     } 
    }, 25); 
}; 

run(work, function() { 
    alert('Work is done!'); 
}); 

は(少なくとも私はこれがあなたがやっていることだと思います)、複数のタイムアウトを実行するための本当の利点がないシングルスレッドです。ブラウザを遅くすることさえあります。

+0

私は、このアプローチが、すべてのアイテムのタイムアウトを正面に設定し、完了をチェックするのではなく、現在のものが完了したときに次の作業項目にタイムアウトを再帰的に設定するという主な違いがあると思います。私はそれを試すことができます...歓声 – Brabster

+0

、おかげでたくさんのお菓子を動作します。 – Brabster

1

javascriptはシングルスレッドですが、複数のajaxコールを同時に実行することができます。私は最近、潜在的に何百ものAjaxコールを行う必要のあるサイトを持っていて、ブラウザはそれを処理できませんでした。一度に5つの呼び出しを実行するためにsetTimeOutを使用するキューを作成しました。返されたajax呼び出しの1つがコールバック(1つのスレッドによって処理される)を起動し、次にスタック上で次の呼び出しを行いました。

あなたは一度に1人の人にしか話すことができないマネージャーで、5人の従業員の割り当てを与えてから、応答を待ちます。最初の従業員が戻って情報を提供したら、新しい割り当てを与え、次の従業員(または同じ従業員)が戻ってくるのを待つ。だからあなたは "シングルスレッド"だが、5つのことが同時に起こっている。

関連する問題