①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");
输出:
⑤全部监听移除:
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");
输出:
⑥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");
输出:
但注意:
【1】这个似乎只能对事件的error有效,假如你把发射error事件那行替换为随便几个字母,他依然是会出错然后退出的
【2】注意,error事件不能将console.log替换为error(),会导致直接出错退出
【3】另外,我尝试了用console.log,还有util.inspect方法来显示这个函数内容,可是没成功。