2013-04-11 5 views
6

Nur versuchen, mich mit Async-Modul für NodeJS herumzukämpfen.NodeJS, Async forEachSeries Ausführungsreihenfolge

Ich habe den folgenden Code.

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(); 
}); 

Ich möchte den Prozess des obigen Codes so machen, dass der Druck

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 
..... 

wird, aber stattdessen ich bin immer so etwas wie ..

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

Wie behebe ich das?

+2

Wenn Sie eine synchrone Ausgabe benötigen, warum führen Sie sie asynchron aus? – NilsH

+0

hm. führt forEachSeries nicht synchron aus? – ericbae

+0

Beide Knoten 0.10.3 und 0.8.16 erzeugen die gewünschte Ausgabe auf meinem Mac. Verlegen Sie die Ausgabe des Skripts in eine Datei (oder ein anderes Programm)? Das ändert das Verhalten von 'process.stdout' und daher auch' console.log', was zu einer anderen Ausgabe führen kann. Und 'forEachSeries' ist insofern synchron, als die nächste Iteration nur aufgerufen wird, wenn die vorhergehende abgeschlossen ist. – robertklep

Antwort

10

Die forEachMethod akzeptiert auch einen Rückruf, wenn alles fertig ist. So sollte der Code wie folgt aussehen:

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(); 
    }); 
}); 

Das Problem in Ihrem Code ist die Tatsache, dass Sie async.forEachSeries annehmen synchron sein, aber es ist nicht. Es garantiert die Tatsache, dass das Array synchron behandelt wird, aber die Funktion selbst ist asynchron.

+0

Könnten Sie bitte weiter ausführen "Es garantiert die Tatsache, dass das Array synchron behandelt wird, aber die Funktion selbst ist asynchron."? Wenn jedes Element des Arrays synchron behandelt wird, bedeutet das nicht, dass die Funktion, die auf jedes der Elemente angewendet wird, auch synchron ist? – ericbae

+0

Wenn du deinen Code weiter durchführst, denke ich, dass ich es jetzt verstehe. :) – ericbae

+0

Danke! Ich war zwei Stunden lang dabei gewesen. Ihre Antwort hat den Rückrufmechanismus für verschachteltes Async bereinigt. * – Sterex