2013-04-11 12 views
6

Sto solo cercando di capire come usare il modulo Async per NodeJS.Ordine di esecuzione NodeJS, Async forEachSeries

Ho il seguente codice.

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

Voglio fare il processo del codice di cui sopra in modo tale che la stampa fuori diventa

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

Ma invece sto ottenendo qualcosa di simile ..

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

Come posso risolvere questo?

+2

Se è necessaria l'uscita sincrona, perché la si esegue asincrona? – NilsH

+0

hm. does forEachSeries non esegue in modo sincrono? – ericbae

+0

Entrambi i nodi 0.10.3 e 0.8.16 producono l'output desiderato sul mio Mac. Stai canalizzando l'output dello script in un file (o in un altro programma)? Questo cambia il comportamento di 'process.stdout', e quindi anche di' console.log', in modo che possa produrre un output differente. E 'forEachSeries' è sincrono in quanto la prossima iterazione sarà chiamata solo una volta che il precedente è stato eseguito. – robertklep

risposta

10

ForEachMethod accetta anche una richiamata quando tutto è stato eseguito. Quindi, il codice dovrebbe essere così:

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

Il problema nel codice è il fatto che si assume async.forEachSeries essere sincrona, ma non lo è. Garantisce il fatto che la matrice verrà gestita in modo sincrono, ma la funzione stessa è asincrona.

+0

Potresti per favore espandere "Garantisce il fatto che la matrice verrà gestita in modo sincrono, ma la funzione stessa è asincrona."? Se ogni elemento dell'array viene gestito in modo sincrono, ciò non implica che la funzione applicata a ciascuno degli elementi sia anche sincrona ?? – ericbae

+0

Passando oltre il tuo codice, penso di averlo capito ora. :) – ericbae

+0

Grazie! Mi ero rotto a testa in testa per due ore. La tua risposta ha chiarito il meccanismo di callback per async nidificato. * – Sterex