Skip to content

Commit 860d83d

Browse files
committed
add
1 parent 8344861 commit 860d83d

File tree

1 file changed

+80
-3
lines changed

1 file changed

+80
-3
lines changed

企业级/流.md

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)