2013-02-17 104 views
1

流行的node.js模塊async包含集合和控制流的功能,其中一些版本可以並行或串行操作。通過node.js +異步模塊實現同步回調

但其中我找不到一種方法來構建一個循環操作系列。

我試圖做同樣的,因爲這僞代碼:

forever { 
    l = getline(); 

    if (l === undefined) { 
     break; 
    } else { 
     doStuff(l); 
    } 
} 
  • 如果我想getLine()並行叫我可以使用async.whilst的所有呼叫。
  • 如果我想迭代一個數組而不是像forwhile這樣的循環,我可以使用async.eachSeries

我能用什麼來獲得控制流中的series行爲而不是集合迭代?

回答

1

async.whilst確實執行其功能的串行像你需要,那麼你可以做這樣的事情:如果你想在系列執行環就像一個同步碼

var l = getline(); 
async.whilst(
    function() { return l !== undefined; }, 
    function (callback) { 
     doStuff(l); 
     l = getline(); 
     callback(); // Check function isn't called again until callback is called 
    }, 
    function (err) { 
     // All done 
    } 
); 
+0

這讓我思考'async.whilst()'比'while'更有優勢嗎?以及是否有任何情況下實際的異步循環結構會有意義。 – hippietrail 2013-02-17 06:50:45

+0

@hippietrail在你的'doStuff'是同步的情況下,一個簡單的'while'是更好的選擇。但是,如果'doStuff'是異步的,那麼'while'會有意義。 – JohnnyHK 2013-02-17 14:19:18

+0

實際上我的getLine()是異步的,雖然我的僞代碼是「僞」來揭示( - ;所以我認爲還是有好處的,另一個我能想到的是邏輯計數和檢查循環應該隨着功能的增長而變成一個埋藏的細節。 – hippietrail 2013-02-18 05:57:00

0

,你應該使用異步。串聯或async.waterfall

系列(任務,[回調])

運行的功能串聯陣列,電子一旦一個 前一個功能完成,就會運行一個。如果系列中的任何功能通過 回調出現錯誤,則不會運行更多功能,系列的回調 立即使用錯誤值調用。一旦 任務已完成,結果將作爲數組傳遞給最終回調 。

瀑布(任務,[回調])

運行在一系列功能的陣列,每個傳遞它們的結果到 下一在數組中。但是,如果任何函數將錯誤 傳遞給回調,則不會執行下一個函數,並立即調用主要的 回調並返回錯誤。

瀑布鏈回調傳遞一個輸出作爲下一個的輸入,系列只是串聯執行。

+0

謝謝,但您可能沒有在我的問題中看到我的問題沒有涉及任務列表,並且這兩個函數都明確地列出了任務列表。 – hippietrail 2013-02-17 10:13:54