举例讲解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 相关文章推荐
动态控制Table的js代码
Mar 07 Javascript
js 判断checkbox是否选中的实现代码
Nov 23 Javascript
Js基础学习资料
Nov 23 Javascript
JS图片无缝滚动(简单利于使用)
Jun 17 Javascript
JavaScript实现网页对象拖放功能的方法
Apr 15 Javascript
jQuery中的siblings()是什么意思(推荐)
Dec 29 Javascript
最常见和最有用的字符串相关的方法详解
Feb 06 Javascript
基于JavaScript实现评论框展开和隐藏功能
Aug 25 Javascript
Node.js中sequelize时区的配置方法
Dec 10 Javascript
Angular7.2.7路由使用初体验
Mar 01 Javascript
JavaScript交换两个变量方法实例
Nov 25 Javascript
JS数组转字符串实现方法解析
Sep 04 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语法(1)
2006/10/09 PHP
php5.2时间相差8小时
2007/01/15 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
Auntion-TableSort国人写的一个javascript表格排序的东西
2007/11/12 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
Python脚本实现虾米网签到功能
2016/04/12 Python
python使用pymysql实现操作mysql
2016/09/13 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
10个示例带你掌握python中的元组
2020/11/23 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
社会实践感言
2014/01/25 职场文书
大学生家政服务项目创业计划书
2014/01/30 职场文书
公司合作意向书范文
2014/07/30 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
医院党建工作总结2015
2015/05/26 职场文书
教师节大会主持词
2015/07/06 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
python编写函数注意事项总结
2021/03/29 Python
Python List remove()实例用法详解
2021/08/02 Python
你知道Java Spring的两种事务吗
2022/03/16 Java/Android