举例讲解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 相关文章推荐
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
Feb 18 Javascript
input链接页面、打开新网页等等的具体实现
Dec 30 Javascript
jQuery实现向下滑出的二级菜单效果实例
Aug 22 Javascript
浅析Javascript中bind()方法的使用与实现
Apr 29 Javascript
AngularJS控制器之间的数据共享及通信详解
Aug 01 Javascript
JS实现图片垂直居中显示小结
Dec 13 Javascript
js实现键盘自动打字效果
Dec 23 Javascript
Javascript 一些需要注意的细节(必看篇)
Jul 08 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
Aug 22 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
Oct 23 Javascript
vue路由守卫+登录态管理实例分析
May 21 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
Jul 24 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数组中的重复值的实现代码
2011/07/17 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
PHP new static 和 new self详解
2017/02/19 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
jquery图片轮播特效代码分享
2020/04/20 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
python通过yield实现数组全排列的方法
2015/03/18 Python
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
Python 串口读写的实现方法
2019/06/12 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
人力资源管理毕业生自荐信
2013/11/21 职场文书
公司前台接待岗位职责
2013/12/03 职场文书
小学教研工作制度
2014/01/15 职场文书
大学活动总结范文
2014/04/29 职场文书
新闻学专业求职信
2014/07/28 职场文书
个人事迹材料范文
2014/12/29 职场文书
先进个人材料怎么写
2014/12/30 职场文书
个人优缺点总结
2015/02/28 职场文书
中学生自我评价2015
2015/03/03 职场文书
综合测评自我评价
2015/03/06 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis