2016-04-16 34 views
12

考慮以下幾點:Node.js:你可以在流內使用異步函數嗎?

var asyncFunction = function(data, callback) { 
    doAsyncyThing(function(data){ 
    // do some stuff 
    return callback(err) 
    }) 
} 
fs.createReadStream('eupmc_lite_metadata_2016_04_15.json') 
    .pipe(JSONstream.parse()) 
    .on('data', asyncFunction) // <- how to let asyncFunction complete before continuing 

如何流知道什麼時候asyncFunction已完成?有沒有什麼方法可以在流內使用異步函數?

+0

我不知道流將如何處理回調,因爲文件沒有顯示在兩個參數('數據',功能)。如果你確實想要做一些奇特的事情,你可以暫停流,做你的東西,然後恢復流。 –

+0

@DaveBriand你是否斷言你不能這樣做,還是你重申了這個問題? :) – Fergie

+0

絕對不能將兩個參數函數傳遞給數據流事件。但是,您可以暫停數據事件的流,進行一些異步處理,然後在處理完成時恢復流。 –

回答

8

查看變換流。它們使您能夠在塊上運行異步代碼,然後在完成時調用回調。下面是文檔:https://nodejs.org/api/stream.html#stream_transform_transform_chunk_encoding_callback

舉個簡單的例子,你可以這樣做:

const Transform = require('stream').Transform 
class WorkerThing extends Transform { 
    _transform(chunk, encoding, cb) { 
     asyncFunction(chunk, cb) 
    } 
} 

const workerThing = new WorkerThing() 

fs.createReadStream('eupmc_lite_metadata_2016_04_15.json') 
.pipe(JSONstream.parse()) 
.pipe(workerThing) 
+1

我真的不明白你剛纔在說什麼,但是,我現在看到,轉換流可能是前進的方向。會試試這個。 – Fergie

+1

是的,這有效。 – Fergie

相關問題