Node.js-事件循环
# Node.js-事件循环
事件循环是
Node.js
处理非阻塞 I/O 操作的机制——尽管 JavaScript 是单线程处理的——当有可能的时候,它们会把操作转移到系统内核中去
当其中一个操作完成时,内核会告诉Node.js
,以便Node.js
可以将相应的回调添加到轮询队列中以最终执行。
Node.js
使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户
整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)
Node.js
有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter
类来绑定和监听事件
# 程序绑定事件
// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);
1
2
2
# 程序触发事件
// 触发事件
eventEmitter.emit('eventName');
1
2
2
# 实例
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received');
}
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('数据接收成功。');
});
// 触发 connection 事件
eventEmitter.emit('connection');
console.log("程序执行完毕。");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ node main.js
连接成功。
数据接收成功。
程序执行完毕。
1
2
3
4
2
3
4
# EventEmitter
每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义
对于每个事件,EventEmitter
支持 若干个事件监听器
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递
//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 参数');
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$ node event.js
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数
1
2
3
2
3
# EventEmitter 提供了多个属性
# 方法
方法 | 描述 |
---|---|
addListener(event, listener) | 为指定事件添加一个监听器到监听器数组的尾部 |
on(event, listener) | 为指定事件注册一个监听器 |
once(event, listener) | 为指定事件注册一个单次监听器 |
removeListener(event, listener) | 移除指定事件的某个监听器(两个参数,第一个是事件名称,第二个是回调函数名称) |
removeAllListeners([event]) | 移除所有事件的所有监听器 |
setMaxListeners(n) | 用于改变监听器的默认限制的数量 |
listeners(event) | 返回指定事件的监听器数组 |
emit(event, [arg1], [arg2], [...]) | 按监听器的顺序执行执行每个监听器,如果事件有注册监听返回 true,否则返回 false |
# 类方法
// 返回指定事件的监听器数量。
events.emitter.listenerCount(eventName) //推荐
1
2
2
上次更新: 2024/08/14, 04:14:33