我正在阅读Node.js官方文档来理解流。我正在实现Writable流,但我不明白这两个流之间有什么区别。write
和 _write
.
引用以下文件 这个 节。
从调用writable._write()到调用回调之间发生的所有对writable.write()的调用 都会导致写入的数据被缓冲。当回调被调用时,流可能会发出一个 "drain "事件。如果一个流实现能够同时处理多个数据块,就应该实现writable._writev()方法。
这只是给我一个想法,两者的行为是不同的,但我无法理解如何。
可能是通过举一个例子,基于 此处 在文档中,有谁能解释一下,下面给出的代码片段在从 Readable/Transform
流? 什么是 write
和 _write
对口 Readable
流,如果有的话?
const { Writable } = require('stream');
const myWritable = new Writable({
write(chunk, encoding, callback) {
if (chunk.toString().indexOf('a') >= 0) {
callback(new Error('chunk is invalid'));
} else {
callback();
}
}
});
const { Writable } = require('stream');
class MyWritable extends Writable {
_write(chunk, encoding, callback) {
if (chunk.toString().indexOf('a') >= 0) {
callback(new Error('chunk is invalid'));
} else {
callback();
}
}
}
在你的两个具体的例子中,我认为第一个例子是错误的,或者他们试图说明一些(非实用的)学术观点。 它应该是凌驾于 _write()
,不 write()
. 如果您覆盖 write()
那么你并没有真正使用任何内部的流逻辑,或者你需要稍微修改输入的内容,然后调用基本的实现。write()
. 在这个例子中,你只是接管了顶层的。write()
接口,并将其替换,因此根本不使用流的任何内部结构。
.write()
是可写流的消费者或用户调用的向流对象写入数据的接口。 这是一个公共接口,预计任何使用可写流的人都会使用它。
._write()
是一个内部接口。 它不应该被可写流的消费者或用户调用。 它是由特定类型的流对象的实现者提供的,每当需要将数据写入这个流后面的任何存储时,流本身就会调用它。 它是底层存储的流抽象的一部分。 例如,如果你实现了一个代表向串口写入数据的流对象,作为该流对象的实现者,你必须覆盖通用的 _write()
并提供执行情况 ._write()
每当流基础架构碰巧调用了 _write()
.
注意,流对象的消费者何时调用 .write()
而当流基础设施再调用 ._write()
因为在流对象中进行了缓冲。
这种设计也允许你有一个通用的流接口,它下面可以有成千上万个不同的实际存储机制,在这里提供一个 ._write()
方法是实现存储接口的一部分,以便为该存储提供一个通用的流接口。