举例讲解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 相关文章推荐
利用404错误页面实现UrlRewrite的实现代码
Aug 20 Javascript
JavaScript 原型继承之构造函数继承
Aug 26 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
Feb 02 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
Aug 03 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
Oct 17 Javascript
Node.js实现的简易网页抓取功能示例
Dec 05 Javascript
深入浅出分析javaScript中this用法
May 09 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
Dec 27 Javascript
React-Router如何进行页面权限管理的方法
Dec 06 Javascript
JS实现数组深拷贝的方法分析
Mar 06 Javascript
vue 调用 RESTful风格接口操作
Aug 11 Javascript
解决vue scoped html样式无效的问题
Oct 24 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 Rename 更改文件、文件夹名称
2011/05/24 PHP
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
Apache服务器无法使用的解决方法
2013/05/08 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
Position属性之relative用法
2015/12/14 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
JavaScript实现Excel表格效果
2020/02/07 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
python sys模块sys.path使用方法示例
2013/12/04 Python
Python常用的爬虫技巧总结
2016/03/28 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
python发送邮件功能实现代码
2016/07/15 Python
Php多进程实现代码
2018/05/07 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
实例讲解Python3中abs()函数
2019/02/19 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
如何通过python检查文件是否被占用
2020/12/18 Python
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
销售行业个人求职自荐信
2013/09/25 职场文书
自荐信格式技巧有哪些呢
2013/11/19 职场文书
学生党支部先进事迹
2014/02/04 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
小学教师寄语大全
2014/04/03 职场文书
档案信息化建设方案
2014/05/16 职场文书
月考总结与反思
2015/10/22 职场文书
PyTorch device与cuda.device用法
2022/04/03 Python