读(拉)vs管(控制流)vs数据(推)

时间:2014-03-31 06:04:38

标签: node.js

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

我的问题是关于现实生活的应用 这些不同的选择。我很了解 可读/读取,数据事件和 管道,但不是非常有信心选择具体 方法

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

1 个答案:

答案 0 :(得分:5)

对于大多数事情,您应该能够使用

src.pipe(dest);

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

对于all the work I do with streams,我通常只选择正确的流类型(ReadableWritableDuplexTransformPassThrough)然后在流上定义正确的方法(_read_write和/或_transform)。最后,我使用.pipe将所有内容连接在一起。

看到流设置似乎是“循环”

是很常见的
client.pipe(encoder).pipe(server).pipe(decoder).pipe(client)

举个例子,这是我在burro模块中使用的流。您可以对象写入此流,然后您可以从中读取 JSON字符串。

// https://github.com/naomik/burro/blob/master/lib/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();

通过将编码器输出到stdout

来查看编码器输出的内容
encoder.pipe(process.stdout);

将一些示例对象写入其中

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

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