2016-04-16 7 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

:あなたが何かのように行うことができ、簡単な例としてhttps://nodejs.org/api/stream.html#stream_transform_transform_chunk_encoding_callback

:ここではドキュメントです( 'データ'、機能)。あなたは何か気になることをしたい場合は、ストリームを一時停止し、あなたのものを行い、次にストリームを再開することができます。 –

+0

@DaveBriandあなたはあなたがこれを行うことができないと断言しているのですか、それともあなたはその質問を再投稿していますか? :) – Fergie

+0

2つの引数関数をデータストリームイベントに渡すことは絶対にできません。ただし、データイベントでストリームを一時停止し、非同期処理を行い、処理が完了したらストリームを再開できます。 –

答えて

8

変換ストリームを確認してください。チャンクで非同期コードを実行し、終了したらコールバックを呼び出すことができます。私は、ドキュメントは上の2つのパラメータが表示されないので、ストリームは、コールバックを処理するかどうかはわかりません

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

関連する問題