微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

举例讲解Node.js中的Writable对象

只要有玩过 nodejs,那就一定接触过 Writable。http 模块的请求回调参数中的 res 参数就是一个 Writable 对象。我们经常会往上面 write 一堆东西,最后调用个 end 方法吧?这些都属于 Writable 的行为。   我们手动创建的 Writable 对象是交给用户使用的,那么 write 和 end 方法都是用户调用的。作为提供方,我们如何知道自己的 Writable 对象被用户执行了什么操作呢?就猜这个 API 吧,我首先会猜到某个事件。然而并不是!同 Readable 一样,它也得覆写某个方法来监听操作。下面是创建一个 Writable 让用户往里面写入内容,并监听用户到底写了什么的例子(基于 babel-node):

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 没有被覆写将抛出异常:

rush:plain;"> 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 方法用户调用了。如果其间做的是写文件的操作,此时就应该关闭文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐