nodejs事件模块

nodejs 里所有事件类型基本都是由 events 模块开提供, js 是异步执行的,在很多情况下需要同步执行, 这时可以使用 events 模块来实现同步

event 模块主要是 EventEmitter 类, 使用 event.EventEmitter 类来实例化一个事件对象

1
2
let event = require("events"); // 引入events模块
let emit = new event.EventEmitter(); // 实例化一个events对象

注册监听事件

接着使用事件对象的 addListener, on ,once 方法添加事件监听函数. on 是 addListener 的别名. 第二个参数的 this 对象指向 emit, 当是箭头函数时 this 被绑定.

1
2
3
4
5
6
7
8
9
10
11
12
emit.addListener("eventNme", (res) => {
console.log("我是eventName事件,通过addListener方法添加的函数");
});

emit.on("eventNme", (res) => {
console.log("我是eventName事件,通过on方法添加的函数");
});

emit.once("eventNme", (res) => {
console.log("我是eventName事件,通过once方法添加的函数");
});
// once方法是只会被触发一次,即第一次调用 emit.emit('eventName')时会被触发,之后就不在被触发,而前两种不受影响

对同一事件对象的同一事件名注册的监听函数默认不能超过十个,可以调用事件对象的 setMaxListener(n) 来修改此限制,其中 n 为正整数.’emit.setMaxListener(10)’

触发错误监听函数

1
emit.on("error", callBack);

在实列运行区间发生错误时触发改事件.

触发事件

触发事件比较简单一点,调用事件对象的 emit 方法就可以

1
emit.emit('eventName'[,arg1][,arg2]....) //第一个参数为发射的事件名,后面的参数是传递给监听函数的参数

移除事件的监听函数

移除事件监听函数共有个方法, 事件实例的 removeListener 和 removeAllListener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let event = require("events");
let emit = new event.EventEmitter();

let eventtimes = 0;
function listen() {
console.log("第%d 次触发监听函数", ++eventtimes);
}
emit.on("eventName", listen); // 添加监听函数

emit.emit("eventName"); // 发射事件

emit.removeListener("eventName", listen); // 移除监听函数,当监听函数是匿名函数或箭头函数则不能再次移除(因为无法得到函数的地址)

emit.emit("eventName"); // 再次发射事件,什么也不会做,因为添加的一个监听函数已被移除

// emit.removeAllListener('eventName') ;// 移除eventName事件的所有监听函数