web-dev-qa-db-ja.com

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が完了したことをどのようにして知るのですか?ストリーム内から非同期関数を使用する方法はありますか?

22
Fergie

変換ストリームを確認してください。チャンクで非同期コードを実行し、完了したらコールバックを呼び出すことができます。ここにドキュメントがあります: 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)
18
Ryan Quinn