举例讲解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 相关文章推荐
IE iframe的onload方法分析小结
Jan 07 Javascript
js改变embed标签src值的方法
Apr 10 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
Nov 07 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
Feb 16 Javascript
Angular2 (RC4) 路由与导航详解
Sep 21 Javascript
详解RequireJs官方使用教程
Oct 31 Javascript
微信小程序ibeacon三点定位详解
Oct 31 Javascript
利用不到200行代码写一款属于你自己的js类库
Jul 08 Javascript
element-ui 中使用upload多文件上传只请求一次接口
Jul 19 Javascript
layer弹出层自适应高度,垂直水平居中的实现
Sep 16 Javascript
JS实现音乐导航特效
Jan 06 Javascript
js正则表达式简单校验方法
Jan 03 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
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
php命令行写shell实例详解
2018/07/19 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
快速了解python leveldb
2018/01/18 Python
Django框架多表查询实例分析
2018/07/04 Python
python的concat等多种用法详解
2018/11/28 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
python递归下载文件夹下所有文件
2019/08/31 Python
python与mysql数据库交互的实现
2020/01/06 Python
python解包用法详解
2021/02/17 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
新闻记者实习自我鉴定
2013/09/19 职场文书
护理实习自我鉴定
2013/12/14 职场文书
住宅使用说明书
2014/05/09 职场文书
幼儿园户外活动总结
2014/07/04 职场文书
借款民事起诉状范文
2015/05/19 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs