举例讲解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 相关文章推荐
实现checkbox全选、反选、取消JavaScript小脚本异常
Apr 10 Javascript
网站接入QQ登录的两种方法
Jul 22 Javascript
Javascript常用小技巧汇总
Jun 24 Javascript
input输入密码变黑点密文的实现方法
Jan 09 Javascript
详解基于webpack2.x的vue2.x的多页面站点
Aug 21 Javascript
基于Cookie常用操作以及属性介绍
Sep 07 Javascript
jquery之基本选择器practice(实例讲解)
Sep 30 jQuery
angular ng-model 无法获取值的处理方法
Oct 02 Javascript
JavaScript实现学生在线做题计时器功能
Dec 05 Javascript
如何实现一个简易版的vuex持久化工具
Sep 11 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 Javascript
Vue自定义render统一项目组弹框功能
Jun 07 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制作静态网站的模板框架(二)
2006/10/09 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
php按单词截取字符串的方法
2015/04/07 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
javascript静态的url如何传递
2007/05/03 Javascript
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
python实现简单温度转换的方法
2015/03/13 Python
python监控文件或目录变化
2016/06/07 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
导师就业推荐信范文
2014/05/22 职场文书
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技