【问题标题】:What are the semantics of the return value of nodejs stream.Readable.push()nodejs stream.Readable.push()的返回值的语义是什么
【发布时间】:2015-12-18 14:28:45
【问题描述】:

我有这个代码:

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

什么是正确的做法?

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

    return Boolean 是否应该执行更多推送

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

    因此,当您实现 TransformStream 时,您可以放心地忽略来自 push() 的返回值。

    有关更多信息,请参阅:

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多