Node.js可写流:写与_写的区别

问题描述 投票:0回答:1

我正在阅读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();
    }
  }
}
node.js node-streams writable
1个回答
1
投票

在你的两个具体的例子中,我认为第一个例子是错误的,或者他们试图说明一些(非实用的)学术观点。 它应该是凌驾于 _write(),不 write(). 如果您覆盖 write()那么你并没有真正使用任何内部的流逻辑,或者你需要稍微修改输入的内容,然后调用基本的实现。write(). 在这个例子中,你只是接管了顶层的。write() 接口,并将其替换,因此根本不使用流的任何内部结构。


.write() 是可写流的消费者或用户调用的向流对象写入数据的接口。 这是一个公共接口,预计任何使用可写流的人都会使用它。

._write() 是一个内部接口。 它不应该被可写流的消费者或用户调用。 它是由特定类型的流对象的实现者提供的,每当需要将数据写入这个流后面的任何存储时,流本身就会调用它。 它是底层存储的流抽象的一部分。 例如,如果你实现了一个代表向串口写入数据的流对象,作为该流对象的实现者,你必须覆盖通用的 _write() 并提供执行情况 ._write() 每当流基础架构碰巧调用了 _write().

注意,流对象的消费者何时调用 .write() 而当流基础设施再调用 ._write() 因为在流对象中进行了缓冲。

这种设计也允许你有一个通用的流接口,它下面可以有成千上万个不同的实际存储机制,在这里提供一个 ._write() 方法是实现存储接口的一部分,以便为该存储提供一个通用的流接口。

© www.soinside.com 2019 - 2024. All rights reserved.