代码之家  ›  专栏  ›  技术社区  ›  Cinn smfoote

可读性高水印实用性

  •  1
  • Cinn smfoote  · 技术社区  · 6 年前

    highWaterMark 如果我们不在 _read() 方法?

    如果我理解正确,程序员可以自行决定停止阅读,如果他不这样做,没有什么能阻止它(甚至没有 pipe )

    1 回复  |  直到 6 年前
        1
  •  0
  •   Michał Karpacki    6 年前

    DR: 是的,但这不是你需要担心的事情。:)

    你说得对,高水位线对实际读数(或生成数据)没有任何影响,但它确实对 Readable.._read 或者更确切地说,它会影响你从中获得的信息 Readable..push . 所以尽管你不需要也不应该在你的 _read 实现——它确实有一个实用程序。

    为了解释,我们先从文档开始 Readable.._read - 阅读,阅读 当流数据低于时调用 _highWaterMark 理想情况下,在到达目的地之前 drain 需要发出事件。每当调用该方法时,它都会在 push 方法由实现调用。

    所以,您所说的是,没有什么可以阻止您编写这个实现:

    _read(sizeRequired) {
        const x = readLotsOfChunksDisregardingSizeRequired();
        x.forEach(chunk => this.push(chunk);
    }
    

    当然,这是真的,在某些情况下,你不能真正控制阅读,这是可以接受的。然而 高水印 也用于在 方法。

    因此,如果我们考虑另一个可以控制源代码的实现:

    _read(numRequired) {
        while (true) { // I know, I know don't write while true's...
            const chunk = readASingleChunk();
            if (!this.push(chunk))
                return;
        }
    }
    

    在这种情况下, 高水印 机器将在每次写入块后进行检查,如果您实际到达 highWaterMark this.push(chunk) 将返回 false 而您的流将根据需要使用尽可能少的内存,并且还将以合理的速率保持流动。

    请记住,您正在编写的实现可以以流式方式读取,并将通过管道传输到可写流。这个 highWarerMark 确保流不断地流动,并有效地使用用于保持该状态的内存。