当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《nodejsstream.Readable.push()返回值的语义是什么》经验,为你挑选了1个好方法。

我有这个代码:

"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的返回值.

什么是正确的做法?



1> John Zwinck..:

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变换流的背压的正确方法?

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有