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


Posted in Javascript onJuly 29, 2015

只要有玩过 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 方法被用户调用了。如果其间做的是写文件的操作,此时就应该关闭文件。

Javascript 相关文章推荐
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 Javascript
js 复制或插入Html的实现方法小结
May 19 Javascript
jquery 操作DOM案例代码分享
Apr 05 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
Aug 24 Javascript
js修改input的type属性问题探讨
Oct 12 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
Apr 16 Javascript
jQuery实现的进度条效果
Jul 15 Javascript
JS与jQ读取xml文件的方法
Dec 08 Javascript
Angular2 多级注入器详解及实例
Oct 30 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
Jan 27 Javascript
React组件设计模式之组合组件应用实例分析
Apr 29 Javascript
js实现购物车商品数量加减
Sep 21 Javascript
浅谈Javascript数组索引
Jul 29 #Javascript
JQ实现新浪游戏首页幻灯片
Jul 29 #Javascript
JavaScript中几种排序算法的简单实现
Jul 29 #Javascript
详解JavaScript中数组的相关知识
Jul 29 #Javascript
javascript+canvas实现刮刮卡抽奖效果
Jul 29 #Javascript
js实现登陆遮罩效果的方法
Jul 28 #Javascript
怎么通过onclick事件获取js函数返回值(代码少)
Jul 28 #Javascript
You might like
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
Angular的$http与$location
2016/12/26 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
Python中operator模块的操作符使用示例总结
2016/06/28 Python
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
解决python3中解压zip文件是文件名乱码的问题
2018/03/22 Python
浅谈python标准库--functools.partial
2019/03/13 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
pandas按条件筛选数据的实现
2021/02/20 Python
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
商务英语本科生的自我评价分享
2013/11/15 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
2014年检验科工作总结
2014/11/22 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
优秀党支部申报材料
2014/12/24 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android