举例讲解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类代码
Jun 27 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
Nov 05 Javascript
jquery利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
jquery命令汇总,方便使用jquery的朋友
Jun 26 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
Jun 14 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
Dec 02 Javascript
javascript使用call调用微信API
Dec 15 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
May 17 Javascript
利用Javascript实现一套自定义事件机制
Dec 14 Javascript
全面介绍vue 全家桶和项目实例
Dec 27 Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
JavaScript实现动态生成表格
Aug 02 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
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
python下如何让web元素的生成更简单的分析
2008/07/17 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
Python 绘图和可视化详细介绍
2017/02/11 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
男方父母证婚词
2014/01/12 职场文书
公司总经理任命书
2014/06/05 职场文书
学校班班通实施方案
2014/06/11 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技