且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

NodeJs——(5)与 events 事件模块

更新时间:2022-06-11 02:32:29

①events模块只提供了一个对象,events.EventEmitter

他的核心是 事件发射 和 事件监听 功能

 

每个事件由一个事件名(用于标识事件),和多个参数组成。

 

事件名:字符串,通常表达一定的语义;

 

事件被发射时,监听该事件的函数被依次调用。

 

 

②调用模块:

var events = require("events");
var emitter = new events.EventEmitter();

事件监听:

emitter.on("/click", function () {
    console.log("first event");
})
emitter.on("/click", function () {
    console.log("second event");
})

事件发射:

emitter.emit("/click");

注意:

【1】/click是事件名(用于标识事件)

【2】可以多个监听,用于监听同一个事件,然后依次执行;

【3】需要先监听,后发射;

【4】监听是on,发射是emit

【5】把emit发射的事件赋值给变量。如果有监听该事件的,则变量值为true,如果无监听该事件,则返回值为false。注意,该变量赋值后不会改变。

即:

var nn = emitter.emit("/click1");
emitter.on("/click1", function () {
    console.log("first event");
})
console.log(nn);

其值nn依然为false。

 

 

③只监听一次:

EventEmitter.once(事件名, 回调函数)

即把上面的on替换为once即可,然后这个只监听一次就失效;

 

 

④移除监听:

EventEmitter.removeListener(事件名, 回调函数名)

注意,这里的关键是:回调函数名,如代码:

 

var events = require("events");
var emitter = new events.EventEmitter();
var first = function () {
    console.log("first event");
}
var second = function () {
    console.log("second event");
}

emitter.on("/click", first)
emitter.on("/click", second)
emitter.emit("/click");
emitter.removeListener("/click", first);
console.log("————移除完成————");
emitter.emit("/click");

输出:

NodeJs——(5)与 events 事件模块

 

⑤全部监听移除:

var events = require("events");
var emitter = new events.EventEmitter();
var first = function () {
    console.log("first event");
}
var second = function () {
    console.log("second event");
}

emitter.on("/click", first)
emitter.on("/click", second)
emitter.emit("/click");
emitter.removeAllListeners("/click");
console.log("————移除完成————");
emitter.emit("/click");

输出:

NodeJs——(5)与 events 事件模块

 

⑥error事件

当遇见异常时会发射error事件,EventEmitter规定,如果没有监听其的监听器,Node.js会把其当成异常,退出程序并打印调用栈。

因此需要设置监听其的监听器,避免遇见错误后整个程序崩溃。

var events = require("events");
var emitter = new events.EventEmitter();
var first = function () {
    console.log("first event");
}
var error = function (error) {
    console.log(error);
}

emitter.on("/click", first)
emitter.on("error", error)  //如果没有这一行代码,下面在发射error时会出错然后退出程序
emitter.emit("/click");
emitter.emit("error", error)
console.log("————移除完成————");
emitter.emit("/click");

输出:

NodeJs——(5)与 events 事件模块

 

但注意:

【1】这个似乎只能对事件的error有效,假如你把发射error事件那行替换为随便几个字母,他依然是会出错然后退出的

【2】注意,error事件不能将console.log替换为error(),会导致直接出错退出

【3】另外,我尝试了用console.log,还有util.inspect方法来显示这个函数内容,可是没成功。