Web 技术研究所

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

nodejs stream 之 Writable

  前面说了 Readable,那么与之对应的就是 Writable 了。只要有玩过 nodejs,那就一定接触过 Writable。http 模块的请求回调参数中的 res 参数就是一个 Writable 对象。我们经常会往上面 write 一堆东西,最后调用个 end 方法吧?这些都属于 Writable 的行为。
  我们手动创建的 Writable 对象是交给用户使用的,那么 write 和 end 方法都是用户调用的。作为提供方,我们如何知道自己的 Writable 对象被用户执行了什么操作呢?就猜这个 API 吧,我首先会猜到某个事件。然而并不是!同 Readable 一样,它也得覆写某个方法来监听操作。下面是创建一个 Writable 让用户往里面写入内容,并监听用户到底写了什么的例子(基于 babel-node):
import stream from 'stream';

var w = new stream.Writable;

w._write = (buffer, enc, next) => {
  console.log(buffer + '');
  next(); // 触发「写入完成」
};

w.on('finish', () => {
  console.log('finish');
});
 
void function callee(i) {
  if(i < 10) {
    w.write(i + '', 'utf-8', () => {
      // 写入完成
    });
  } else {
    w.end();
  }
  setTimeout(callee, 10, i + 1);
}(0);
  同 Readable 的 _read 一样,如果上面的 _write 没有被覆写将抛出异常:
Error: not implemented
    at Writable._write (_stream_writable.js:430:6)
    at doWrite (_stream_writable.js:301:12)
  另外,write 被设计为一个异步方法,它又第三个参数可以传入完成的回调。而所谓完成就是在实现函数 _write 中,next 参数被调用。把 write 设计成异步是有原因的,如果它是同步执行,那么当我们需要在 _write 方法中处理一些异步事务时就可能产生顺序出错。比如一个磁盘文件的写操作就是一个异步的,如果我们写文件无视这个异步,那么假如上一个写操作被堵塞还没完成,当前的写操作可能会先执行。所以我们应该在 _write 中合理地调用 next(必须调用,否则将陷入等待,无法继续写)。
  最后,当数据写完成后会触发 finish 事件,这就意味着 end 方法被用户调用了。如果其间做的是写文件的操作,此时就应该关闭文件。
网名:
54.146.176.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^