因为在node当中的大部分功能模块都依赖了events,所以events模块是Nodejs当中非常重要的模块之一。events对外暴露的是一个class即EventEmitter。EventEmitter的作用有两个,分别是对事件的监听与发射。
1、实现on和emit
自定义一个方法,输出的内容为“我很帅”。通过event当中的on与emit来实现对事件的监听与发射。
//引入events模块
const EventEmitter = require("events");
//myEmitter继承EventEmitter类
class myEmitter extends EventEmitter{};
//实例化对象
var even=new myEmitter();
//自定义一个函数
function ev1(){
console.log("我很帅!");
}
//通过实例化对象event的on方法,自定义一个start的监听事件
even.on("start",ev1);
//触发名字叫做start的自定义事件
even.emit("start");
给事件传值
输出的结果为“我很帅!怎么办,怎么办?”
//引入events模块
const EventEmitter = require("events");
//myEmitter继承EventEmitter类
class myEmitter extends EventEmitter{};
//实例化对象
var even=new myEmitter();
//自定义一个函数
function ev1(str){
console.log("我很帅!"+str);
}
//通过实例化对象event的on方法,自定义一个start的监听事件
even.on("start",ev1);
//触发名字叫做start的自定义事件
even.emit("start","怎么办,怎么办?");
emit可以触发多次
以下代码,在上面代码的基础上多发射了一次。你会发现“我很帅”被输出二次!
//引入events模块
const EventEmitter = require("events");
//myEmitter继承EventEmitter类
class myEmitter extends EventEmitter{};
//实例化对象
var even=new myEmitter();
//自定义一个函数
function ev1(){
console.log("我很帅!");
}
//通过实例化对象event的on方法,自定义一个start的监听事件
even.on("start",ev1);
//触发名字叫做start的自定义事件
even.emit("start");
even.emit("start");
通过on定义名字相同的监听
结果会输出"我很帅!我很苦恼!"。说明监听事件名字相同,调用一次,均会执行!
//引入events模块
const EventEmitter = require("events");
//myEmitter继承EventEmitter类
class myEmitter extends EventEmitter{};
//实例化对象
var even=new myEmitter();
//自定义一个函数
function ev1(){
console.log("我很帅!");
}
function ev2(){
console.log("我很苦恼!");
}
//通过实例化对象event的on方法,自定义一个start的监听事件
even.on("start",ev1);
even.on("start",ev2);
//触发名字叫做start的自定义事件
even.emit("start");
2、once方法
通过这个方法的名字,你可能已经猜到这个方法的作用了!没错它的作用就是当你多次触发emit时,只会执行一次。也就是当你执行一次事件后将会从对应关系中移除掉。
以下代码虽然被多次emit,但只会输出一次"我很帅”
//引入events模块
const EventEmitter = require("events");
//myEmitter继承EventEmitter类
class myEmitter extends EventEmitter{};
//实例化对象
var even=new myEmitter();
//自定义一个函数
function ev1(){
console.log("我很帅!");
}
//通过实例化对象event的on方法,自定义一个start的监听事件
even.once("start",ev1);
//触发名字叫做start的自定义事件
even.emit("start");
even.emit("start");
3、removeListener
通过该方法可以移除指定的监听事件。以下代码最后一次emit时无效!
//引入events模块
const EventEmitter = require("events");
//myEmitter继承EventEmitter类
class myEmitter extends EventEmitter{};
//实例化对象
var even=new myEmitter();
//自定义一个函数
function ev1(){
console.log("我很帅!");
}
//通过实例化对象event的on方法,自定义一个start的监听事件
even.on("start",ev1);
//触发名字叫做start的自定义事件
even.emit("start");
//移除事件名字为start,方法为ev1的监听
even.removeListener("start",ev1);
even.emit("start");
4、removeAllListeners
移除所有的监听事件。执行后你会发现啥也没有输出!
//引入events模块
const EventEmitter = require("events");
//myEmitter继承EventEmitter类
class myEmitter extends EventEmitter{};
//实例化对象
var even=new myEmitter();
//自定义一个函数
function ev1(){
console.log("我很帅!");
}
function ev2(){
console.log("我还很有才!");
}
//通过实例化对象event的on方法,自定义一个start的监听事件
even.on("start",ev1);
even.on("start",ev2);
//触发名字叫做start的自定义事件
//移除所有事件名字为start的监听
even.removeAllListeners("start");
even.emit("start");
5、eventNames
eventNames方法可以罗列出已注册的所有监听器的事件,类型为数组
//引入events模块
const EventEmitter = require("events");
//myEmitter继承EventEmitter类
class myEmitter extends EventEmitter{};
//实例化对象
var even=new myEmitter();
//自定义一个函数
function ev1(){
console.log("开始!");
}
function ev2(){
console.log("结束!");
}
//通过实例化对象event的on方法,自定义一个start的监听事件
even.on("start",ev1);
even.on("over",ev2);
console.log(even.eventNames());//[ 'start', 'over' ]
网友评论