0%

node学习笔记

nodejs学习笔记

EventEmitter

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

基础代码:

1
2
3
4
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

主要方法:

onemit,即监视器触发器

简单演示代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//event.js 文件
var events = require('events');
var emitter = new events.EventEmitter();

//监听事件
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener2', arg1, arg2);
});

//触发事件
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');

值得注意的是,还额外提供了一个叫做addListener的函数,作用为:为指定事件添加一个监听器到监听器数组的尾部。

不过经过测试发现,addListeneron效果一样,也就是说on函数也是默认在尾部添加监听事件

执行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function (arg1, arg2) {
console.log('listener1', arg1, arg2);
});
emitter.addListener('someEvent', function (arg1, arg2) {
console.log('先添加的', arg1, arg2);
});
emitter.on('someEvent', function (arg1, arg2) {
console.log('listener2', arg1, arg2);
});
emitter.addListener('someEvent', function (arg1, arg2) {
console.log('后添加的', arg1, arg2);
});
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');

所得结果为:

listener1 arg1 参数 arg2 参数

先添加的 arg1 参数 arg2 参数

listener2 arg1 参数 arg2 参数

后添加的 arg1 参数 arg2 参数

该对象本身自己就含有一个类方法listenerCount

1
2
//获取指定事件的监听器数量
events.emitter.listenerCount(eventName)

Buffer

什么是buffer?

Buffer是内存区域,它表示在 V8 JavaScript 引擎外部分配的固定大小的内存块(无法调整大小),可以将 buffer 视为整数数组,每个整数代表一个数据字节

Buffer的作用

Buffer 被引入用以帮助开发者处理二进制数据,在此生态系统中传统上只处理字符串而不是二进制数据

Buffer 与流紧密相连。 当流处理器接收数据的速度快于其消化的速度时,则会将数据放入 buffer 中

一个简单的场景是:当观看 YouTube 视频时,红线超过了观看点:即下载数据的速度比查看数据的速度快,且浏览器会对数据进行缓冲

什么是流?

一种以高效的方式处理读/写文件、网络通信、或任何类型的端到端的信息交换

在传统的方式中,当告诉程序读取文件时,这会将文件从头到尾读入内存,然后进行处理。使用流,则可以逐个片段地读取并处理(而无需全部保存在内存中)。

因此可以简单理解为我可以边读取文件边对读取的内容进行处理,而不是读取完整个文件再进行处理,所以有以下特点:

  • 内存效率: 无需加载大量的数据到内存中即可进行处理
  • 时间效率: 当获得数据之后即可立即开始处理数据,这样所需的时间更少,而不必等到整个数据有效负载可用才开始

未写完….