举例讲解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 相关文章推荐
C#中TrimStart,TrimEnd,Trim在javascript上的实现
Jan 17 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
Apr 23 Javascript
使用js Math.random()函数生成n到m间的随机数字
Oct 09 Javascript
使用node.js 获取客户端信息代码分享
Nov 26 Javascript
jQuery实现动态文字搜索功能
Jan 05 Javascript
jQuery ajax调用webservice注意事项
Oct 08 jQuery
Vue中render函数的使用方法
Jan 31 Javascript
一个简单的node.js界面实现方法
Jun 01 Javascript
JavaScript中this函数使用实例解析
Feb 21 Javascript
javascript贪吃蛇游戏设计与实现
Sep 17 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
Oct 09 jQuery
详解如何在Canvas中添加事件的方法
Apr 17 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
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
Python中存取文件的4种不同操作
2018/07/02 Python
python操作excel的方法
2018/08/16 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
python list多级排序知识点总结
2019/10/23 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
通信工程专业毕业生推荐信
2013/12/25 职场文书
骨干教师培训方案
2014/05/06 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
运动会广播稿20字
2015/08/19 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
python 判断文件或文件夹是否存在
2022/03/18 Python
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript