举例讲解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层级选择器用法分析
Feb 10 Javascript
JS简单实现无缝滚动效果实例
Aug 24 Javascript
完美的js div拖拽实例代码
Sep 24 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
Mar 21 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
Mar 29 Javascript
ionic2自定义cordova插件开发以及使用(Android)
Jun 19 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
Mar 15 Javascript
对vue中methods互相调用的方法详解
Aug 30 Javascript
jQuery实现的简单歌词滚动功能示例
Jan 07 jQuery
详解使用webpack+electron+reactJs开发windows桌面应用
Feb 01 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
May 14 Javascript
Element Cascader 级联选择器的使用示例
Jul 27 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中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
用RadioButten或CheckBox实现div的显示与隐藏
2013/09/21 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
2020/08/20 Javascript
js闭包和垃圾回收机制示例详解
2021/03/01 Javascript
使用IPython下的Net-SNMP来管理类UNIX系统的教程
2015/04/15 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
python批量赋值操作实例
2018/10/22 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
python 实现绘制整齐的表格
2019/11/18 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
医学生自我评价
2014/01/27 职场文书
大学生求职信范文
2014/05/24 职场文书
解除劳动合同证明书
2014/09/26 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书