【问题标题】:Why does my Node.js stream return something when invoking its read function?为什么我的 Node.js 流在调用它的读取函数时会返回一些东西?
【发布时间】:2018-09-27 14:30:12
【问题描述】:

我很难理解,为什么下面的方法有效,也就是说,为什么read() 函数的调用实际上返回了存储在可读流中的对象。

const { Readable } = require('stream')
var r = new Readable({objectMode: true, read: () => {}}) // dummy read
var a = [1,2,3,4,5,6,7]
r.push(...a)

现在,当我调用 r.read() 时,我得到了我推入可读流 r 的数字

r.read() // -> 1
r.read() // -> 2
// etc

但在创建可读流时,我在上面提供了一个“虚拟”read 函数 (read: () => {})。那么,为什么我在调用read 时会返回值?

我们将不胜感激。

【问题讨论】:

    标签: node.js stream


    【解决方案1】:

    答案很简单。您正在调用应该由您的 read 实现调用的 push 方法。

    push 的目的是说:这是我从源代码中读到的内容,但不必从内部方法中调用它。

    也就是说在这个过程中:

    • 等待 _read 被调用
    • _从源代码中读取内容
    • 将读取的块推送到流
    • 从读取中返回块

    您只需跳过前两个步骤并从外部推送数据。

    【讨论】:

    • 那么,我是否正确假设提供的read() => {} 函数不是调用r.read() 时调用的函数。或者换句话说read() => {}不是read([size])
    • 你是,你不是。它被称为好吧,但不是直接的。流类中有很多机器可以调用您的 _read 实现。在您的读取函数中添加console.log 并亲自查看 - 我怀疑 _read 会在您的读取调用之前被调用。
    • 谢谢。确实有帮助。这两个方法在调用堆栈中是相互关联的,但并不完全相同。这确实消除了我之前的困惑。我不禁想知道,两个函数的相同命名read是否一个将数据进入流和另一个读取数据i> 流是一个明智的选择。
    • 嗯——这就是为什么我用下划线来引用内部_read——如果你要实现一个派生自Readable的类,那么你可以简单地实现那个下划线方法。传递 read 函数只是传递 this 的另一种方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多