【问题标题】:What are the roles of _read and read in Node JS streams?_read 和 read 在 Node JS 流中的作用是什么?
【发布时间】:2020-06-02 07:28:16
【问题描述】:

我真的只是想弄清楚这些是如何工作的。 IMO 关于流的文档有些缺乏,实际上并没有很多资源可以全面解释它们是如何工作和扩展的。

我的问题可以分为两部分

一、_read函数在stream模块中的作用是什么?当我运行此代码时,它会无休止地打印出“hello world”,直到将 null 推送到流缓冲区。这似乎表明 _read 在某种循环中被调用,该循环等待缓冲区中的空值,但我在任何地方都找不到明确说明这一点的文档。

var Readable = require('stream').Readable
var rs = Readable()

rs._read = function () {
    rs.push("hello world")
    rs.push(null)
};

rs.on("data", function(data){
    console.log("some data", data)
})

二,read 究竟做了什么?我的理解是 read 消耗来自读取流缓冲区的数据,并触发 data 事件。这就是这里发生的一切吗?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    read() 是 readStream 的使用者在他们想要专门从流中读取一些字节时调用的东西(当流不流动时)。

    _read() 是一个内部方法,它是读取流内部实现的一部分。当流正在流动并且流想要从源获取更多数据时,流的内部调用此方法(它不会从外部调用)。当调用_read() 方法时,使用.push(data) 推送数据,或者如果没有更多数据,则执行.push(null)

    您可以在this article 中查看说明和示例。

    _read(size) {
        if (this.data.length) {
            const chunk = this.data.slice(0, size);
            this.data = this.data.slice(size, this.data.length);               
            this.push(chunk);        
        } else {
            this.push(null); // 'end', no more data
        }
    }
    

    如果您要实现对某个自定义数据源的读取流,那么您将实现 _read() 方法以从您的源中提取最多 size 数量的数据,并将 .push() 该数据提取到流中。

    【讨论】:

    • 谢谢,我说在流类实例化时循环调用_read是否正确?
    • @Carl - 你可以自己研究代码。这里是 in the src ._read() 被调用的地方。它不是在循环内调用的。 _read(size) 的想法是,它应该为您提供与 size 一样多的数据。所以它只会在一些数据被传递给从流中读取数据的任何人并且缓冲区再次有空间(或为空)之后再次被调用。
    猜你喜欢
    • 2014-10-16
    • 2019-07-07
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多