2017-12-03 10 views
0

누군가 다음 동작을 설명 할 수 있습니까? 그것은 확실히 비동기 I/O로 인한 것입니다. 그러나 아래의 코드는 많은 간단한 예제를 기반으로합니다. 일부는 SO에서 발생합니다. 여기서는 스트림이 예상대로 읽히지 않는 문제를 논의하지 않은 것 같습니다.Node.js ReadableStream 및 Asynchronous Event Listener

그리고 해결책은 무엇입니까? 근본적인 문제를 첫 번째 원칙으로 이해하려고 노력 중이므로 게시 된 npm stream -> string 패키지를 사용하지 말 것을 권합니다. 감사. 단말

$ 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 전체 과정 동안 두 번 방출되며, read 한 번만 방출 here