2013-04-11 11 views
6

Sadece NodeJS için Async modülünü kullanarak kafamı almaya çalışıyorum.NodeJS, Async forEachSeries yürütme sırası

Aşağıdaki kodum var. ..

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

Ben baskı dışarı

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

olur şekilde Yukarıdaki kod sürecini yapmak istiyorum Ama bunun yerine şöyle bir şey alıyorum

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

Bunu nasıl düzeltirim?

+2

Senkronize çıkışa ihtiyacınız varsa, bunu neden uyumsuz olarak gerçekleştiriyorsunuz? – NilsH

+0

hm. forEachSeries senkronize bir şekilde gerçekleştirmiyor mu? – ericbae

+0

Hem Node 0.10.3 ve 0.8.16, Mac'imde istediğiniz çıkışı üretir. Komut dosyasının çıktısını bir dosyaya (veya başka bir programa) mı aktarıyorsunuz? Bu, process.stdout'un ve dolayısıyla 'console.log'un da davranışını değiştirir, dolayısıyla farklı çıktılara neden olabilir. Ve 'forEachSeries', bir sonraki yinelemenin yalnızca bir kez yapıldıktan sonra çağrılacağı zaman uyumludur. – robertklep

cevap

10

forEachMethod, her şey bittiğinde bir geri çağırma da kabul eder. Yani kod aşağıdaki gibi görünmelidir:

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

kodunuzda sorun senkron olmasını async.forEachSeries farz olduğu gerçeği, ama değil. Dizinin eşzamanlı olarak ele alınacağını garanti eder, ancak fonksiyonun kendisi asenkrondir.

+0

"Dizinin eşzamanlı olarak ele alınacağını ancak fonksiyonun kendisinin eş zamanlı olmadığını garanti eder." Dizinin her bir öğesi eşzamanlı olarak işlenirse, bu, öğelerin her birine uygulanan işlevin aynı zamanda senkronize olduğunu ima etmez mi? – ericbae

+0

Kodunuzu daha da ileriye taşıyorum, sanırım şimdi anladım. :) – ericbae

+0

Teşekkürler! İki saat boyunca başımdan kırılıyordum. Cevabınız iç içe async için geri arama mekanizmasını temizledi. * – Sterex