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

回到顶部