Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

nodejs stream 之 Transform

  之前的 pipe 是用于把两个对象的输入输出关联起来的。虽然这个概念本身很容易理解,但我好像扯到了链的概念,那也许就需要其他东西的支持才能理解了。除了 Readable 和 Writable 对象外,还有一个同时实现了它们的对象 Transform,它通常被用于中间节点。
其实 Readable/Writable 这两个对象虽然命名是 ~able 型,但它应该更倾向于 ReadOnly/WriteOnly 之类的概念,只适合作为终止节点。 业务代码可能很复杂,于是我们会引入中间件的概念来解决单个程序过于复杂的问题。
  Transform 同时可以作为 Readable 和 Writable 使用,有了它才把管道的使用标记得更清晰。下面是示例代码,依然是一个 Readable 的数字生成器要输出到一个 Writeable 对象上。但中间还加入了一个 Transform,把所有数值都乘了 2。 import stream from 'stream';

var w = new stream.Writable;
var r = new stream.Readable;
var t = new stream.Transform;

// 定义一个会持续生成数据的 Readable 数据源
r._read = () => {};
void function callee(i) {
  r.push(i + '');
  setTimeout(callee, 200, i + 1);
}(0);

// 中间节点
t._read = () => {};
t._write = (data, enc, next) => {
  t.push(data * 2 + '');
  next();
};

// 定义一个会将接收到的数据输出的输出源
w._write = (data, enc, next) => {
  console.log(data + '');
  next();
};

// 关联
r.pipe(t).pipe(w);
  其实这个东西也很恶心的,在 _write 中做 push 操作这个设定实在不能忍。反正无论看多少次,我都对这套 API 爱不起来。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^