如何理解stream读取数据
发布于 8 年前 作者 warmhole 4593 次浏览 来自 问答

大家好,有个stream的问题请教下: stream.on(‘data’,function(data){ res.write(data); }); 事件是在什么时候回调的呢?在执行var stream = require(‘fs’).createReadStream(‘pic.png’);的时候这个stream里面存放的是什么呢?假如一个没有注册data回调会怎么样呢?谢谢! stream.png

9 回复

虽然我理解的是在可以提供数据的时候触发

没有应该就在暂停模式,一旦添加data listener就转换为flowing mode,文档应该都写了。

顺便,node的Stream有好多历史包袱,各种状态管理再加上历史兼容,我是看源码看跪了。能写出Stream2的人真是佩服他们。

node Changelog有个关于Stream3的图,感受下,反正对我还是抽象一点好。

stream3

’data‘事件,最开始应该只是设计来让流尽可能快把可以给出的数据给出,是没有流量控制的。监听data事件时,就相当于告诉流我准备好了,尽快把数据给我。(push stream)。这是stream1

但有时需要控制流量。所以后来搞了个readable事件,Consumer可以根据自身能力read数据(pull stream).这是熟称的stream2

最后,大概人们想在支持pull 数据的时候也能够监听data事件,于是read的时候也会触发data事件了。大概,这就是人们所称的stream3。

这样发展下来,估计大家都会迷惑,反正我这种渣渣迷惑了,大神们估计很清晰

正好之前对这个感兴趣研究了下历史,但水平有限,只是一些浅见。希望有帮助

关于Stream的历史与设计可以看看我的笔记,安利哈哈哈

@reverland 这。。看起来。。。感觉坑略深。我有一次遇到一个 2g 的 json 文件要处理,后来是找了个 star 数比较多的库,直接拿来用。。这是我遇到的最需要 stream 的场景了。

其他的需要用的场景,应该就是 res.pipe(req) 这种了,就是 web 代理这方面的。不过这一块也一般就一句话用着而已。

@alsotang 个人觉得,stream是数据处理需求驱动的模式,一种将无限数据分布在无限时间上处理的思维模型。整个思维是以数据流向为核心。一般偏重逻辑流程控制不大会以数据为核心。。。

用过音频处理的库stream是标配哈哈,话说这种几乎没副作用的输入输出流好有函数式编程的感觉。。。

@alsotang 确实觉得,细节不用太关注,说到底只是控制两边数据流动的一个抽象,现在比较好用就好…

可以看一下这篇博客http://www.tuicool.com/m/articles/meuuqy

来自酷炫的 CNodeMD

@githubmann 哈哈哈哈,谢谢。我就是看了这篇文章产生的疑惑。

@alsotang @reverland 谢谢,对于菜鸟的我,感觉上面的内容水有点深。我还是先学好怎么弄吧,十分感谢!

@warmhole 是我没说清楚。。我觉得只是历史发展带来的迷惑。。。其实理解成unix 管道就好。有人还说过完全没感觉有什么区别。。

回到顶部