2013-04-11 16 views
6

Po prostu staram się zrozumieć za pomocą modułu Async dla NodeJS.NodeJS, Async forEachSeries Kolejność wykonywania

Mam następujący kod.

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

chcę, aby proces powyższego kodu w taki sposób, że wydruk staje

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

Ale zamiast ja dostaję coś takiego ..

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

Jak to naprawić?

+2

Jeśli potrzebujesz wyjścia synchronicznego, dlaczego wykonujesz je asynchronicznie? – NilsH

+0

hm. czy forEachSeries nie działa w sposób synchroniczny? – ericbae

+0

Węzły 0.10.3 i 0.8.16 generują żądany wynik na moim Macu. Czy wyprowadzasz wyjście skryptu do pliku (lub innego programu)? Zmienia to zachowanie 'process.stdout', a co za tym idzie' console.log', co może skutkować różnymi wyjściami. A 'forEachSeries' jest synchroniczne, ponieważ następna iteracja zostanie wywołana dopiero po zakończeniu poprzedniego. – robertklep

Odpowiedz

10

ForEachMethod akceptuje również oddzwanianie, gdy wszystko jest gotowe. Więc kod powinien wyglądać tak:

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

Problem w kodzie jest fakt, że można zakładać async.forEachSeries być synchroniczny, ale tak nie jest. Gwarantuje to, że tablica będzie obsługiwana synchronicznie, ale sama funkcja jest asynchroniczna.

+0

Czy mógłbyś rozwinąć dalej "To gwarantuje, że tablica będzie obsługiwana synchronicznie, ale sama funkcja jest asynchroniczna."? Jeśli każdy element tablicy jest obsługiwany synchronicznie, czy nie oznacza to, że zastosowana funkcja TO każdego elementu jest również synchroniczna? – ericbae

+0

Przechodząc dalej twój kod, myślę, że dostaję go teraz. :) – ericbae

+0

Dzięki! Przerwałem przez to przez dwie godziny. Twoja odpowiedź wyjaśniła mechanizm wywoływania dla asynchronizacji zagnieżdżonej. * – Sterex

Powiązane problemy