举例讲解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 相关文章推荐
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
Jun 25 Javascript
细说浏览器特性检测(2)-通用事件检测
Nov 05 Javascript
JS实现标签页效果(配合css)
Apr 03 Javascript
js实现通用的微信分享组件示例
Mar 10 Javascript
jquery实现叠层3D文字特效代码分享
Aug 21 Javascript
Angular ng-repeat 对象和数组遍历实例
Sep 14 Javascript
微信小程序 合法域名校验出错详解及解决办法
Mar 09 Javascript
Element input树型下拉框的实现代码
Dec 21 Javascript
详解Next.js页面渲染的优化方案
Jan 27 Javascript
js实现3D照片墙效果
Oct 28 Javascript
详解JavaScript匿名函数和闭包
Jul 10 Javascript
javascript canvas时钟模拟器
Jul 13 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
Display SQL Server Version Information
2007/06/21 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
python使用turtle库绘制时钟
2020/03/25 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
python 字符串格式化的示例
2020/09/21 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
计算机开发个人求职信范文
2013/09/26 职场文书
人事主管的岗位职责
2013/11/16 职场文书
银行求职推荐信范文
2013/11/30 职场文书
网络营销策划方案
2014/06/04 职场文书
献爱心标语
2014/06/21 职场文书
要账委托书范本
2014/09/15 职场文书
2014年标准化工作总结
2014/12/17 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书
Go语言读取txt文档的操作方法
2022/01/22 Golang