如下:
Readable Stream | Readable Stream | |
---|---|---|
事件 | data、end、error、close、readable | drain、finish、error、close、pipe、unpipe |
方法 | pipe() unpipe() wrap() destroy() read() unshift() resume() pause() isPaused() setEncoding() |
write() destroy() end() cork() uncork() setDefaultEncoding() |
可读流事件(Readable Stream)
可读流有两种状态:
- paused状态(默认状态)
- flowing状态
在还没有添加data事件前,该流会变成flowing状态,删除data事件后,就会变回paused状态。
data事件与end事件
data事件会将流送到需要到达的地方,该流是一个字符串或者 Buffer,该事件会在数据传送到的时候触发。
end事件会在流传送结束的时候,也是就完全没有流时,就会触发。
error事件
在任何时候都有可能触发,只要有错误出现,就会触发该事件
close事件
在流或者文件关闭后触发,之后将不再触发任何事件。
readable.pipe()方法
数据写入目标,如 stream.pipe(stream2).pipe(stream3)
readable.read()方法
读取流的数据
可写流(Readable Stream)
drain事件
当流流干的时候,就会触发该事件。
场景1:stream1 流数据到 stream2 时,假如读写速度特别快,或者读写时间很长,就很可能会出现流的速度很快,导致通过管道的时候出现“堵车”的情况,就不会继续往下读,如下代码
//假如steam1一有了数据,就立马传给了stream2
stream1.on('data', (chunk) => {
stream2.write(chunk)
})
//stream1停了,stream2就停
stream1.on('end', () => {
stream2.end()
})
会很容易造成堵车情况,这时候我们可以停止该流的流入,转而监听事件,如下:
//假如steam1一有了数据,就立马传给了stream2
stream1.on('data', (chunk) => {
const flag = stream2.write(chunk) //该flag,会得到true、false
//false表示数据堆积,写太快了,撑不下,这个时候需要监听 drain 事件
if(flag === false){
//当数据不积压的时候,就是流干了,会触发该事件
stream2.on('drain', () => {
//继续写
})
}
})
//stream1停了,stream2就停
stream1.on('end', () => {
stream2.end()
})
finish事件
如果说 drain事件是某段某段写完后就会触发,那么 finish就是全部写完后才会触发。
注意的是,该事件会在 stream.end()
之后,且在缓冲区数据都已经传给底层系统之后,才会触发finish。
pipe事件
有人往stream2插入管道,就会触发该事件。
unpipe事件
与pipe事件相反,就是移除管道。
write方法
就是写东西,如stream2.write(cheunk)
,往stream写入数据。