简单了解node stream
Posted luoxiaoer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单了解node stream相关的知识,希望对你有一定的参考价值。
Almost all Node.js applications, no matter how simple, use streams in some manner.
开篇先吓吓自己。画画图,分析分析代码加深自己的理解。
简单了解node stream
- stream基本概念
- Writable - 可写入数据的流
- Readable - 可读取数据的流
- node中其它模块stream 的应用
- 总结
1.stream基本概念
1.1什么是 stream
1. 在编写代码时,我们应该有一些方法将程序像连接水管一样连接起来 -- 当我们需要获取一些数据时,可以去通过"拧"其他的部分来达到目的。这也应该是IO应有的方式。 -- Doug McIlroy. October 11, 1964
结合到node中
stream 就像是一个抽象的模型(有点像水管),能有序的传输数据(有点像水),需要时就拧开水管取点用,还可以控制大小。
- Writable - 可写入数据的流(例如 fs.createWriteStream())。
- Readable - 可读取数据的流(例如 fs.createReadStream())。
- Duplex - 可读又可写的流(例如 net.Socket)。
- Transform - 在读写过程中可以修改或转换数据的 Duplex 流(例如 zlib.createDeflate())。
1.Readable-可读取数据的流
1.1 简单描述Readable 可读取数据流
可读流是对提供数据的来源的一种抽象。就像水管传递水资源供我们消费使用一样。
可读流有两种模式:流动模式(flowing)或暂停模式(paused)
- 流动模式flowing,数据自动从底层系统读取,并通过EventEmitter 接口的‘’data‘事件尽可能快地被提供给应用程序。
- 暂停模式paused, 数据必须显示通过调用stream.read()读取数据。
1.2Readable 可读取数据流举个例子
举个例子:
const { Readable } = require(‘stream‘); class myReadable extends Readable { constructor(options,sources) { super(options) this.sources = sources this.pos = 0 } // 继承了Readable 的类必须实现 _read() 私有方法,被内部 Readable类的方法调用 // 当_read() 被调用时,如果从资源读取到数据,则需要开始使用 this.push(dataChunk) 推送数据到读取队列。 // _read() 应该持续从资源读取数据并推送数据,直到 readable.push() 返回 false
// (可以暂时理解readable.push(),push(null) 会返回false) _read() { if(this.pos < this.sources.length) { this.push(this.sources[this.pos]) this.pos ++ } else { this.push(null) } } } let rs = new myReadable({},"我是罗小布,我是某个地方来的水资源") let waterCup = ‘‘ // 绑定监听器到 ‘data‘ 事件时,流会转换到流动模式。 // 当流将数据块传送给消费者后触发。 rs.on(‘data‘,(chunk)=>{ console.log(chunk); // chunk 是一个 buffer waterCup += chunk }) rs.on(‘end‘,()=>{ console.log(‘读取消耗完毕‘); console.log(waterCup) })
从上述代码开启调试:
大概的画了一下flowing模式的流程图:(这个图真心不好看,建议看后面的那个)
_read() 函数里面push 是同步操作会先将数据存储在this.buffer 变量中,然后再从this.buffer 变量中取出,emit(‘data‘,chunk) 消费掉
_read() 函数里面push 是异步,一旦异步操作中调用了push方法,且有数据,此时会直接emit(‘data‘,chunk) 消费掉。
由上简化图形:
以上是关于简单了解node stream的主要内容,如果未能解决你的问题,请参考以下文章
read ECONNRESET at TLSWrap.onStreamRead (internal/stream_base_commons.js:209:20) { errno: -4077(代码片段