2013-04-11 66 views
6

只是試圖讓我的頭周圍使用NodeJS的異步模塊。NodeJS,異步forEachSeries執行順序

我有以下代碼。

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

我要讓上面的代碼的過程中以這樣的方式,打印出來變成

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

我該如何解決?

+2

如果你需要同步輸出,你爲什麼要執行異步? – NilsH 2013-04-11 07:22:25

+0

hm。不是forEachSeries以同步方式執行嗎? – ericbae 2013-04-11 07:26:10

+0

節點0.10.3和0.8.16都可以在我的Mac上生成所需的輸出。您是否將腳本的輸出傳輸到文件(或其他程序)?這會改變'process.stdout'的行爲,因此也會改變'console.log',這樣可能會導致不同的輸出。 'forEachSeries'是同步的,因爲只有在完成之前纔會調用下一次迭代。 – robertklep 2013-04-11 07:44:26

回答

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 2013-04-11 12:40:20

+0

進一步瀏覽你的代碼,我想我現在明白了。 :) – ericbae 2013-04-11 12:43:09

+0

謝謝!我已經打破了兩個小時。你的回答清除了嵌套異步的回調機制。* – Sterex 2016-01-28 09:27:38