举例讲解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 相关文章推荐
js 跨域和ajax 跨域问题小结
Jul 01 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
Jan 23 Javascript
js特效,页面下雪的小例子
Jun 17 Javascript
jquery中获得元素尺寸和坐标的方法整理
May 18 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
Mar 02 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
Apr 16 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
Jan 21 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
Mar 10 Javascript
动态创建Angular组件实现popup弹窗功能
Sep 15 Javascript
简述vue中的config配置
Jan 23 Javascript
JS实现可针对算术表达式求值的计算器功能示例
Sep 04 Javascript
vue3 源码解读之 time slicing的使用方法
Oct 31 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获取文件后缀名的三个函数
2012/10/15 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
让Python代码更快运行的5种方法
2015/06/21 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
python IP地址转整数
2020/11/20 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
单位证明范文
2015/06/18 职场文书
Python Django模型详解
2021/10/05 Python
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技