2017-12-03 10 views
0

誰かが次のような動作を説明できますか?これは確かに非同期I/Oのためですが、以下のコードは多くの簡単な例に基づいていますが、SOからのものもあります。Node.js読み取り可能なストリームと非同期のイベントリスナー

解決策は何ですか?基本的な問題を最初の原則から理解しようとしていますので、公開されているnpmストリーム - 文字列パッケージを使用するようにアドバイスしないでください。ありがとう。ターミナル

$ uname -a 
Linux bsh 4.10.0-40-generiC#44~16.04.1-Ubuntu SMP Thu Nov 9 15:37:44 UTC  2017 x86_64 x86_64 x86_64 GNU/Linux 
$ node --version 
v6.12.0 
$ node n.js 
o = undefined 
data 
data 
end 

出力において

与えられたファイルn.js

'use strict'; 

const streamToString = (s, cb) => { 
    const chunks = [] 

    s.on('readable',() => { 
    console.log('data') 
    let chunk 
    while(null !== (chunk = s.read())) { 
     chunks.push(chunk) 
    } 
    }) 
    s.on('end',() => { 
    console.log('end') 
    cb(Buffer.concat(chunks).toString()) 
    }) 
} 

let o 
const f = (str) => { 
    o = JSON.parse(str) 
} 

const fs = require('fs') 
const rs = fs.createReadStream('t.json') 
streamToString(rs, f) 

console.log('o = ' + o) 

は簡単な検証JSONを含む、任意の非空の入力ファイルを保持しています。私も「読み取り」イベント、すなわち

s.on('read', (chunk) => { 
    console.log('data') 
    chunks.push(chunk) 
    }) 

と出力が

o = undefined 
data 
end 

答えて

0

1であると試してみた

console.log('o = ' + o)は同期コードであるため、コールバック関数の前に実行しますfstreamToStringに渡します。これは非同期で実行されます。したがって、console.log('o = ' + o)の時間が終了したときには、f関数はまだ実行されていないため、oは未定義です。コールバック関数fの中のconsole.logを移動して、必要なものを取得してください。

const f = (str) => { 
    o = JSON.parse(str); 
    console.log('o = ' + o); 
} 

2:readableは、全体のプロセス中に2回放出され、そしてreadは一度だけ放出され、より詳細here

を見ます
関連する問題