我有这个代码:
"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字节.第一个144写入状态,推送返回true.剩下的写入(其中1210个)都声明push返回false.
out.json最终成为in.json的完整副本 - 因此没有删除任何字节.
这让我不知道如何处理push的返回值.
什么是正确的做法?
该push()
文档(https://nodejs.org/api/stream.html#stream_readable_push_chunk_encoding)说:
return Boolean是否应执行更多推送
目的是"背压",这意味着当push()
返回false 时,出站缓冲区中可能没有剩余空间.如果您的流正在从磁盘上的文件等位置读取,则在push()
返回false 时将停止读取并等待再次调用.但是在你的情况下,你正在实施_transform()
而不是_read()
,所以你在这个问题上没有太多的选择 - 你已经收到了chunk
并且应该push()
这样做. TransformStream
将在内部缓冲任何多余的内容,并且它可以主动延迟将来对您的_transform()
方法的调用.
因此,当您实现a时,TransformStream
您可以安全地忽略返回值push()
.
有关详细信息,请参阅:
Node.js可读流_read用法
什么是处理node.js变换流的背压的正确方法?