2013-04-11 13 views
6

NodeJS用の非同期モジュールを使用して頭を上げようとしています。NodeJS、Async forEachSeries実行順

私は以下のコードを持っています。

私はプリントアウトが

1 
1 10 
1 11 
1 12 
1 13 
1 14 
2 
2 10 
2 11 
2 12 
2 13 
2 14 
3 
3 10 
3 11 
3 12 
3 13 
3 14 
..... 

しかし、その代わりに、私は..

1 
1 10 
2 
2 10 
1 11 
3 
3 10 
2 11 
1 12 
.... 

のようなものを取得していますなるように、上記のコードのプロセスを作りたい

var a1 = [1,2,3,4,5,6,7,8]; 
async.forEachSeries(a1, function(n1, callback) { 
    console.log(n1); 
    var a2 = [10,11,12,13,14]; 
    async.forEachSeries(a2, function(n2, callback) { 
     console.log(n1 + " " + n2); 
     callback(); 
    }); 
    callback(); 
}); 

これをどうやって解決するのですか?

+2

同期出力が必要な場合は、なぜそれを非同期に実行しますか? – NilsH

+0

hm。 forEachSeriesは同期的に実行されませんか? – ericbae

+0

ノード0.10.3と0.8.16の両方で、私のMacに必要な出力が得られます。スクリプトの出力をファイル(または別のプログラム)にパイプしていますか?これは 'process.stdout'の動作を変更し、' console.log'も変更します。その結果、出力が異なることがあります。そして 'forEachSeries'は、前回の処理が終わると次の繰り返しが呼び出されるという点で同期的です。 – robertklep

答えて

10

forEachMethodは、すべてが完了したときにコールバックを受け入れます。だからあなたのコードは次のようになります。

var a1 = [1,2,3,4,5,6,7,8]; 
async.forEachSeries(a1, function(n1, callback_s1) { 
    console.log(n1); 
    var a2 = [10,11,12,13,14]; 
    async.forEachSeries(a2, function(n2, callback_s2) { 
     console.log(n1 + " " + n2); 
     callback_s2(); 
    }, function() { 
     /* Finished the second series, now we mark the iteration of first series done */ 
     callback_s1(); 
    }); 
}); 

あなたのコード内の問題は、あなたが同期するasync.forEachSeriesを想定しているという事実であるが、そうではありません。これは、配列が同期して処理されることを保証しますが、関数自体は非同期です。

+0

配列を同期して処理することは保証されていますが、関数自体は非同期であることを保証してください。配列の各要素が同期して処理される場合、要素のそれぞれに適用される関数が同期的であることを暗示していませんか? – ericbae

+0

あなたのコードをさらに進めて、私は今それを得ると思います。 :) – ericbae

+0

ありがとう!私はこれ以上頭を2時間かけて壊していた。あなたの答えはネストされた非同期のコールバックメカニズムをクリアしました。* – Sterex