举例讲解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里怎么取select标签里的值并修改
Dec 10 Javascript
jQuery写的日历(包括日历的样式及功能)
Apr 23 Javascript
window.location.reload 刷新使用分析(去对话框)
Nov 11 Javascript
非常漂亮的相册集 使用jquery制作相册集
Apr 28 Javascript
Centos6.8下Node.js安装教程
May 12 Javascript
Vue实现todolist删除功能
Jun 26 Javascript
菊花转动的jquery加载动画效果
Aug 19 jQuery
Javascript 实现 Excel 导入生成图表功能
Oct 22 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
Feb 01 Javascript
vue实现动态显示与隐藏底部导航的方法分析
Feb 11 Javascript
javascript异步编程的六种方式总结
May 17 Javascript
js实现ajax的用户简单登入功能
Jun 18 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
php生成随机颜色的方法
2014/11/13 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
使用PHP开发留言板功能
2019/11/19 PHP
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
python实时分析日志的一个小脚本分享
2017/05/07 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
Python matplotlib实时画图案例
2020/04/23 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
配置管理计划的主要内容有哪些
2014/06/20 面试题
怎样有效的进行自我评价
2013/10/06 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
大连星海广场导游词
2015/02/10 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android
Nginx报404错误的详细解决方法
2022/07/23 Servers