@@ -48,18 +48,95 @@ const stream = require('stream');
4848
4949所有可读流都实现了 stream.Readable 类定义的接口。
5050
51- 类事件
51+ Node.js可读流是对提供数据的来源的一种抽象。所有可读流都实现了stream.Readable类定义的接口。可读流常见的例子包括客户端的HTTP响应,服务器的HTTP请求,fs的读取流,zlib流,crypto流,TCP socket,子进程stdout与stderr, process.stdin.
5252
53- close 事件在流或其底层资源被关闭时触发。
53+ ## stream.Readable 类事件
5454
55- data 事件
55+ stream.Readable 类定义了如下事件。
5656
57+ 1 . close事件
5758
59+ close事件在流或其底层资源(如文件描述符)被关闭时触发。表明不会再触发其他事件,也不会再发生操作。
5860
61+ 不是所有可读流都会触发close事件。如果使用emitClose选项创建可读流,则它将始终发出close事件。
5962
63+ 2 . data事件
6064
65+ data事件是在流将数据块传送给“消费者”后触发。对于非对象模式的流,数据块可以是字符串或Buffer。对于对象模式的流,数据块可以是除了null的任何JavaScript值。
6166
67+ 当调用 readable.pipe(), readable.resume() 或绑定监听器到 data 事件时,流会转换到流动模式。当调用 readable.read()且有数据块返回时,也会触发data事件。
6268
69+ 如果使用 readable.setEncoding() 为流指定 🈯️ 了默认的字符编码,则监听器回调传入的数据为字符串,否则传入的数据为Buffer。
70+
71+
72+ 3 . end事件
73+
74+ end 事件在流中没有数据可供消费时触发。
75+
76+ end 事件只有在你数据被完全消费掉后才会触发。要想触发该事件,可以将流转换到流动模式,或反复调用 stream.read() 直到数据被消费完。
77+
78+ ``` js
79+ const readable = getReadableStreamSomehow ();
80+
81+ readable .on (' data' , (chunk ) => {
82+ console .log (` 接收到${ chunk .length } 个字节的数据` );
83+ });
84+
85+ readable .on (' end' , () => {
86+ console .log (` 已经没有数据` );
87+ });
88+ ```
89+
90+ 4 . error事件
91+
92+ error事件通常是在当流因底层内部出错而不能产生数据,或推送无效的数据块时触发。
93+
94+ 监听器回调将传递一个Error对象
95+
96+ 5 . pause事件
97+
98+ 调用 stream.pause() 并且 readsFlowing 不为 false时,会发出pause事件。
99+
100+ 6 . readable事件
101+
102+ readable事件在当流中有数据可供读取时触发。
103+
104+ ``` js
105+ const readable = getReadableStreamSomehow ();
106+
107+ readable .on (' readable' , function () {
108+ // 有数据可读取
109+ let data;
110+ while (data = this .read ()) {
111+ console .log (data);
112+ }
113+ });
114+ ```
115+
116+ 当到达流数据的尽头时,readable事件也会触发,但是在end事件之前触发。
117+
118+ readable 事件表明流有新的动态,要么有新的数据,要么到达流的尽头。对于前者,stream.read() 会返回可用的数据。对于后者,stream.read() 会返回 null 。 例如,下面的例子中,foo.txt是一个空文件。
119+
120+ ``` js
121+ const fs = require (' fs' );
122+ const rr = fs .createReadStream (' data.txt' );
123+ rr .on (' readable' , () => {
124+ console .log (` 读取的数据${ rr .read ()} ` );
125+ });
126+ rr .on (' end' , () => {
127+ console .log (' 结束' );
128+ });
129+ ```
130+
131+ 通常情况下, readable.pipe() 和 data事件的机制比 readable 事件更容易理解。处理 readable 事件可能造成吞吐量升高。
132+
133+ 如果同时使用 readable 事件 和 data 事件,则 readable 事件会优先控制流,也就是说,当调用 stream.read() 时才会触发 data 事件。 readableFlowing 属性会变成 false。
134+
135+ 当移除 readable 事件时,如果存在data事件监听器,则流会开始流动,也就是说,无须调用stream.resume() 也会触发data事件。
136+
137+ 7 . resume事件
138+
139+ 调用 stream.resume()并且readsFlowing不为true时,将发出resume事件。
63140
64141
65142
0 commit comments