2011-09-13 7 views
3

多くの非同期作業が完了した後に関数を呼び出す標準的な方法はありますか?私はN個のファイルをループしています。私は非同期関数を呼び出します。ループが終了した後、私はその作業がまだ非同期呼び出しのためループが終了するまでに完了していることを認識するまでバグを引き起こしました。ループが終了したらJSで関数を呼び出しますか?

私のカウントダウンコードを書くのではなく、これらの関数/非同期呼び出しがすべてこのコードを終了した後に言う標準的な方法がありますか?

答えて

3

その後

  1. が上のカウンタをインクリメントすることをそれらのそれぞれにコールバック関数を渡し、あなたのassyncの操作を呼び出す(最初は0に設定)

    をすでに処理されたものの数を保持するカウンタを作成します。

  2. 物事の数はカウンターが安全基本的な考え方があるdone()

を呼び出して、Nに達した場合は、このしかし、エラー処理のために余分なものを追加する必要があるかもしれません。


アシンクロニシティライブラリを使用するのに十分なことがあれば、これを行うための機能があります。たとえば、Dojoには、このような同期のためのdojo.DeferredListがあります。

0

私はこの種のものを使用する傾向がある:

function TaskList(tasks, endOfTasksCallback) { 
    this.doTasks = function() { 
     var numTasks = tasks.length; 
     function singleTaskCallback() { 
      if (--numTasks == 0) { 
       endOfTasksCallback(); 
      } 
     } 
     for (var i = 0; i < tasks.length; i++) { 
      tasks[i](singleTaskCallback); 
     } 
    } 
} 

function createTask(taskIdx) { 
    // a task is a function that does some work 
    // for this demo it's simply a random wait 
    return function (endOfTaskCallback) { 
     var ms = Math.floor(Math.random() * 1000 * 5); 
     var startTime = new Date().getTime(); 
     setTimeout(function() { 
      var endTime = new Date().getTime(); 
      console.log("task " + taskIdx + " completed in " + (endTime-startTime) + "ms."); 
      endOfTaskCallback(); 
     }, ms); 
    } 
} 

var numTasks = 10; 
var tasks = []; 
for (var i = 0; i < numTasks; i++) { 
    tasks.push(createTask(i)); 
} 
new TaskList(tasks, function() { 
    console.log("all done!"); 
}).doTasks(); 

を、あなたは、このような出力が得られます。

task 3 completed in 215ms. 
task 5 completed in 1365ms. 
task 2 completed in 2020ms. 
task 4 completed in 2360ms. 
task 0 completed in 2595ms. 
task 6 completed in 2940ms. 
task 9 completed in 3220ms. 
task 1 completed in 3515ms. 
task 8 completed in 3560ms. 
task 7 completed in 4845ms. 
all done! 
関連する問題