【问题标题】:read (pull) vs pipe(control flow) vs data(push)读取(拉)vs管道(控制流)vs数据(推送)
【发布时间】:2014-05-10 09:07:53
【问题描述】:

Node.js 有不同的选项来使用数据。 流 0、1、2、3 等等...

我的问题是关于现实生活中的应用 这些不同的选择。我相当了解 可读/读取、数据事件和 管道但对选择特定的不是很有信心 方法。

例如,如果我想使用流量控制,请阅读 可以使用一些手工作业以及管道。 数据事件忽略流量控制,我应该停止使用吗 纯数据事件?

【问题讨论】:

标签: node.js


【解决方案1】:

对于大多数事情,你应该可以使用

src.pipe(dest);

如果您查看the source code for the Stream.prototype.pipe implementation,您会发现它只是一个非常方便的包装器,可以为您设置一切

对于我对流所做的所有工作,我通常只选择正确的流类型(ReadableWritableDuplexTransformPassThrough),然后定义正确的方法(@ 987654329@、_write 和/或_transform) 在流上。最后,我使用.pipe 将所有内容连接在一起。

看到看起来是“圆形”的流设置是很常见的

client.pipe(encoder).pipe(server).pipe(decoder).pipe(client)

例如,这是我在 burro 模块中使用的流。您可以向此流写入对象,并且可以从中读取 JSON 字符串。

// burro/encoder.js
var stream  = require("stream"),
    util    = require("util");

var Encoder = module.exports = function Encoder() {
  stream.Transform.call(this, {objectMode: true});
};

util.inherits(Encoder, stream.Transform);

Encoder.prototype._transform = function _transform(obj, encoding, callback) {
  this.push(JSON.stringify(obj));
  callback(null);
};

作为一般建议,您几乎总是会这样编写您的 Streams。也就是说,您编写自己的“类”,它继承自内置流之一。直接使用内置流不太实用。


为了演示如何使用它,首先创建一个流的新实例

var encoder = new Encoder();

通过管道将编码器输出到标准输出来查看编码器的输出

encoder.pipe(process.stdout);

向其中写入一些示例对象

encoder.write({foo: "bar", a: "b"});
// '{"foo":"bar","a":"b"}'

encoder.write({hello: "world"});
// '{"hello":"world"}'

【讨论】:

  • 谢谢娜奥米克。我的问题主要是针对内置流而不是自定义/用户定义的流。
  • @PK,我很高兴你的措辞完全一样。你不应该直接使用内置的流对象。你的意思是“子类化”它们。请查看我更新的帖子。
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 2011-09-02
  • 2014-01-24
  • 2010-11-27
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多