Node.js ReadableStream和异步事件监听器
有人可以解释以下行为吗?这当然是由于异步I/O造成的,但下面的代码基于很多简单的例子,其中一些来自SO,显然这里没有讨论这个问题,这里没有按照预期读取流。Node.js ReadableStream和异步事件监听器
有什么解决方案?我试图从第一原理中理解底层问题,所以请不要建议我使用发布的npm stream-> string包。谢谢。
鉴于文件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)
在终端
$ 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
输出适用于任何非空输入文件,包含简单验证JSON。
我也试图与“读”事件,即
s.on('read', (chunk) => { console.log('data')
chunks.push(chunk)
})
和输出
o = undefined data
end
回答:
1:console.log('o = ' + o)
是同步代码,因此它的回调函数之前运行f
您传递给执行异步的streamToString
。所以当时间console.log('o = ' + o)
胜过,f
函数尚未执行,这就是为什么o
未定义。只需在回调函数f
内部移动console.log
即可获得您想要的内容。
const f = (str) => { o = JSON.parse(str);
console.log('o = ' + o);
}
2:readable
在整个过程中被发射两次,read
发射只有一次,看到更多细节here
以上是 Node.js ReadableStream和异步事件监听器 的全部内容, 来源链接: utcz.com/qa/259071.html