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

只要有玩过 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 方法被用户调用了。如果其间做的是写文件的操作,此时就应该关闭文件。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索node.js
Writable
nodejs 遍历json对象、nodejs 遍历对象、nodejs error对象、nodejs 打印对象、nodejs 合并json对象,以便于您获取更多的相关知识。

时间: 2024-08-02 18:12:15

举例讲解Node.js中的Writable对象_node.js的相关文章

深入了解Node.js中的一些特性_node.js

Node.js作为一门新兴的后台语言,旨在帮助程序员快速构建可伸缩的应用程序.Node.js有很多吸引人的地方,有关它的报道不计其数,本文将针对EventEmitter.Streams.Coding Style.Linting.Coding Style等特性进行分析探讨,帮助用户对Node.js有更深入的了解. 作为一个基于Chrome JavaScript 运行时建立的平台,我们对JavaScript 的相关认识,似乎都可应用于node应用程序之上:无需额外的语言扩展或修饰,我们便可以把前端编

浅析Node.js的Stream模块中的Readable对象_node.js

我一直都很不愿意扯 nodejs 的流,因为从第一次看到它我就觉得它的设计实在是太恶心了.但是没办法,Stream 规范尚未普及,而且确实有很多东西都依赖了 nodejs 的流来实现的,所以我也只能捏着鼻子硬着头皮来扯一扯这又臭又硬的 nodejs 流对象了. nodejs 自带了一个叫 stream 的模块,引入它便可以得到一组流对象构造器.现在我只说最简单的 stream.Readable. 其实用过 nodejs 的几乎都接触过 Readable 的实例,只是平时没太在意而已.一个非常典型

浅谈node.js中async异步编程_node.js

1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数.ajax请求等等. 示例: for (var i = 1; i <= 3; i++) { setTimeout(function(){ console.log(i); }, 0); }; 这里大部分人会认为输出123,或者333.其实它会输出 444 这里就是我们要说的异步编程了. 高级函数的定义 这里为什么会说到高级函数,因为高级函数是异

Node.js中child_process实现多进程_node.js

复制代码 代码如下: var http = require('http'); function fib (n) {     if (n < 2) {         return 1;     } else {         return fib(n - 2) + fib(n - 1);     } } var server = http.createServer(function (req, res) {     var num = parseInt(req.url.substring(1)

node.js中 stream使用教程_node.js

这些日子跑去学了一下OC,但是还没有学成.离转行的时间还有很长,顺便回顾一下node的知识. 每种语言来来去去的人很多,但我就离不开node.我并不是使用它开发,只是使用js相对多一些,因此还是研究node比较好,stream在node的地位是很高的.闲时也来看看这个内容,在node的路上,我还是新手. 今天下载了nodeschool的课程看,其中有一个例子.(我修改了一点点) var concat = require('concat-stream'); var http = require('

JS中的log对象获取以及debug的写法

 本篇文章主要是对JS中的log对象获取以及debug的写法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 实例如下:  代码如下: var log = new Logger('***.js') if (log.isDebugEnabled()) {                     log.debug('xxxxx');                 }    

javascript-关于js中在函数对象构造器中定义对象方法的问题

问题描述 关于js中在函数对象构造器中定义对象方法的问题 为什么函数前要有this.changeName=changeName 我是个新手 谢谢了 解决方案 无关在函数前后,赋值是因为为了调用到person内部定义的changeName函数,要不访问不到.也就是为了实现下面 myMonther.changeName('Ballmer');//这么使用函数 解决方案二: changeName是个私有函数,外部是访问不到的,所以要想在外部能够访问到就必须给个外部能访问到的公有属性或者公有方法

js android-android 中无法定义js中的复杂对象

问题描述 android 中无法定义js中的复杂对象 下面是微信提供一个查看图片的接口,实现方式应该就是在android中使用addJavascriptInterface方法 WeixinJSBridge.invoke('imagePreview', { 'current' : dsrc, 'urls' : imgsSrc[gid] }); 问题如下 // for image review webView.addJavascriptInterface(new Object(){ @android

js中遍历Map对象的简单实例_javascript技巧

实例如下: console.log(jsonData);//火狐控制台打印输出: Object { fileNumber="文件编号", fileName="文件名称"} for(var key in jsonData) console.log("属性:" + key + ",值:"+ jsonData[key]); } 打印输出: 属性:fileNumber, 值:文件编号 属性:fileName, 值:文件名称 以上这篇j