gpt4 book ai didi

node.js - nodejs stream.Readable.push() 返回值的语义是什么

转载 作者:搜寻专家 更新时间:2023-11-01 00:17:32 24 4
gpt4 key购买 nike

我有这个代码:

"use strict";

var fs = require("fs");
var stream = require('readable-stream');


var Transform = require('stream').Transform,
util = require('util');

var TransformStream = function() {
Transform.call(this, {objectMode: true});
};
util.inherits(TransformStream, Transform);

TransformStream.prototype._transform = function(chunk, encoding, callback) {
if(this.push(chunk)) {
console.log("push returned true");
} else {
console.log("push returned false");
}
callback();
};

var inStream = fs.createReadStream("in.json");
var outStream = fs.createWriteStream("out.json");
var transform = new TransformStream();

inStream.pipe(transform).pipe(outStream);

in.json 的大小为 88679467 字节。 push 返回 true 的前 144 个写入状态。其余的写入(其中 1210 个)都表示 push 返回 false。

out.json 最终成为 in.json 的完整副本 - 因此没有字节被丢弃。

这让我不知道如何处理 push 的返回值。

什么是正确的做法?

最佳答案

push() 文档 ( https://nodejs.org/api/stream.html#stream_readable_push_chunk_encoding ) 说:

return Boolean Whether or not more pushes should be performed

目的是“背压”,这意味着当 push() 返回 false 时,出站缓冲区中可能没有剩余空间。如果您的流正在从某个地方(例如磁盘上的文件)读取,您将在 push() 返回 false 时停止读取并等待再次调用。但在你的情况下,你正在实现 _transform() 而不是 _read(),所以你在这件事上没有太多选择——你收到了一个 chunk 并且应该 push() 它。 TransformStream 将在内部缓冲任何多余的部分,并且它可以主动延迟将来对您的 _transform() 方法的调用。

因此,当您实现 TransformStream 时,您可以安全地忽略 push() 的返回值。

有关此的更多信息,请参阅:

关于node.js - nodejs stream.Readable.push() 返回值的语义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34357834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com