2011-01-19 14 views
1

私はNode.jsを使用しており、すべてが終了したときにデータを処理する必要がある複数の非同期呼び出しを行っています。私はそれらを入れ子にしていましたが、これは前回の作業が終わるまで開始しないので、実際には効率が悪かったです。私はこれを思い付いた、とそれに露骨に何か問題があるかどう思っ:複数の非同期コールバック - 完了時に配列を使用して関数を呼び出す

var f = function(){}, 
    actualCallback = function() { /* Do real stuff */ }, 
    callbacks = [f, f, f, f, actualCallback]; 

aync(function() { 
    callbacks.shift()(); 
}); 
aync(function() { 
    callbacks.shift()(); 
}); 
aync(function() { 
    callbacks.shift()(); 
}); 
aync(function() { 
    callbacks.shift()(); 
}); 
aync(function() { 
    callbacks.shift()(); 
}); 
+0

それはそれを行う巧妙な方法です。以前はゼロになるまで数字を減らしていました。 – goat

答えて

1

あなたは、配列をそのように動作する関数を定義することができませんか?

function asyncSequence(callbacks) { 
    function doAsync() { 
    async(function() { 
     if (!callbacks.length) return; 
     callbacks[0](); 
     callbacks = callbacks.slice(1); 
     setTimeout(doAsync, 0); 
    }); 
    } 
    doAsync(); 
} 

次にコールバック関数の配列でコールします。

すべての非同期コールバックを同時に起動したい場合は、最初に問題が表示されません。必要に応じて起動してください。あなたがそれらのすべての最後に「参加」の並べ替えを行う必要がある場合は、しかし、あなたは一般的な状態を追跡する必要があると思います:

function asyncSequenceConcurrent(callbacks, whenFinished) { 
    var incomplete = callbacks.length; 
    for (var i = 0; i < callbacks.length; ++i) { 
    async((function(i) { 
     return function() { 
     callbacks[i](); 
     incomplete--; 
     if (!incomplete) { 
      whenFinished(); 
     } 
     }; 
    })(i)); 
    } 
} 
+0

これらのすべてが非同期という名前は単なる例であり、5つの異なることを行う可能性があります。これは私がやっていることとまったく同じことをしているようですが、それを行うのに間違ったことがあれば、もっと問題になります。 –

+0

いいえ、間違ったことはありません。私のポイントは、シーケンスを実行するためのコードを抽象化して別の関数に入れることができることです。シーケンシングをしたいときは、ユーティリティを呼び出すだけです。 – Pointy

関連する問題