Web 技术研究所

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

nodejs stream 之 pipe 方法

  Readable 对象用于产生数据,Writable 对象用于接收数据。虽然通过事件可以实现它们的关联,但 node 的流提供了 pipe(管道) 方法以便更容易地关联这些流对象。管道这东西也不是什么新概念了,它一直都有的,比如在 linux 中「|」符号就直接起到了管道的作用。
  首先,我们先来看看如果没有管道是如何将两个流动关联起来的,下面是代码 import stream from 'stream';

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

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

// 当收到时更新数据
r.on('data', data => {
  w.write(data);
});

// 定义一个会将接收到的数据输出的输出源
w._write = (data, enc, next) => {
  console.log(data + '');
  next();
};
  上面的例子已经是最简单的需求的,但最终还是写出了这么一大坨代码。那要是业务稍微复杂一点,用这种写法岂不是会吐血?所以嘛,pipe 的存在是很有必要的。比如上面这一坨关联代码可以直接使用 pipe 把它们关联起来,做成下面这个样子 import stream from 'stream';

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

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

// 关联
r.pipe(w);

// 定义一个会将接收到的数据输出的输出源
w._write = (data, enc, next) => {
  console.log(data + '');
  next();
};
  注意 pipe 方法的返回值是它作为参数的那个对象,所以链式使用会产生一个细长的链条而不是平行的链条。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^