首页 > 语言 > JavaScript > 正文

举例讲解Node.js中的Writable对象

2024-05-06 16:23:59
字体:
来源:转载
供稿:网友

这篇文章主要介绍了举例讲解Node.js中的Writable对象,是Node.js入门学习中的基础知识,需要的朋友可以参考下

只要有玩过 nodejs,那就一定接触过 Writable。http 模块的请求回调参数中的 res 参数就是一个 Writable 对象。我们经常会往上面 write 一堆东西,最后调用个 end 方法吧?这些都属于 Writable 的行为。

我们手动创建的 Writable 对象是交给用户使用的,那么 write 和 end 方法都是用户调用的。作为提供方,我们如何知道自己的 Writable 对象被用户执行了什么操作呢?就猜这个 API 吧,我首先会猜到某个事件。然而并不是!同 Readable 一样,它也得覆写某个方法来监听操作。下面是创建一个 Writable 让用户往里面写入内容,并监听用户到底写了什么的例子(基于 babel-node):

 

 
  1. import stream from 'stream'
  2.  
  3. var w = new stream.Writable; 
  4.  
  5. w._write = (buffer, enc, next) => { 
  6. console.log(buffer + ''); 
  7. next(); // 触发「写入完成」 
  8. }; 
  9.  
  10. w.on('finish', () => { 
  11. console.log('finish'); 
  12. }); 
  13.  
  14. void function callee(i) { 
  15. if(i < 10) { 
  16. w.write(i + '''utf-8', () => { 
  17. // 写入完成 
  18. }); 
  19. else { 
  20. w.end(); 
  21. setTimeout(callee, 10, i + 1); 
  22. }(0); 

同 Readable 的 _read 一样,如果上面的 _write 没有被覆写将抛出异常:

 

  
  1. Error: not implemented 
  2. at Writable._write (_stream_writable.js:430:6) 
  3. at doWrite (_stream_writable.js:301:12) 

另外,write 被设计为一个异步方法,它又第三个参数可以传入完成的回调。而所谓完成就是在实现函数 _write 中,next 参数被调用。把 write 设计成异步是有原因的,如果它是同步执行,那么当我们需要在 _write 方法中处理一些异步事务时就可能产生顺序出错。比如一个磁盘文件的写操作就是一个异步的,如果我们写文件无视这个异步,那么假如上一个写操作被堵塞还没完成,当前的写操作可能会先执行。所以我们应该在 _write 中合理地调用 next(必须调用,否则将陷入等待,无法继续写)。

最后,当数据写完成后会触发 finish 事件,这就意味着 end 方法被用户调用了。如果其间做的是写文件的操作,此时就应该关闭文件。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选