Nodejs的大部分核心API都是基于异步事件驱动设计的,所有可以分发事件的对象都是EventEmitter类的实例。
大家知道,由于nodejs是单线程运行的,所以nodejs需要借助事件轮询,不断去查询事件队列中的事件消息,然后执行该事件对应的回调函数,有点类似windows的消息映射机制。至于更细的实现环节,可以另行查找资料。
下面介绍EventEmitter的使用。
1、监听事件和分发事件
EventEmitter实例可以使用on
或addListener
监听事件,emit()
方法分发事件,如下所示:
const events = require('events'), EventEmitter = events.EventEmitter, util = require('util');function myEmiter(){ EventEmitter.call(this);};util.inherits(myEmiter,EventEmitter);//继承EventEmitter类const myEmitterIns = new myEmiter();myEmitterIns.on('data',(o)=>{ console.log('receive the data:'+o.a);});
或者使用class类
class myEmiter extends EventEmitter{}//继承EventEmitter类const myEmitterIns = new myEmiter();myEmitterIns.on('data',(o)=>{ console.log('receive the data:'+o.a);});myEmitterIns.emit('data',{a:1});
执行结果如下:
E:/developmentdocument/nodejsdemo>node event-example.js
receive the data:1
2、向事件监听回调函数传递参数
从上面的例子可以看出,emit()
方法可以传递任意的参数集合给回调函数,需要注意的一点是this关键字指向的是调用emit方法的EventEmiter实例,但在箭头函数中例外,this指向的是全局this,因为箭头函数中的this是在定义时绑定。如下所示:
class myEmiter extends EventEmitter{}const myEmitterIns = new myEmiter();myEmitterIns.on('data',function(data){ console.log("普通回调函数中this:"); console.log(this);});myEmitterIns.on('data1',(data1)=>{ console.log("箭头回调函数中this:"); console.log(this);});myEmitterIns.emit('data',{a:1});myEmitterIns.emit('data1',{a:1});
新闻热点
疑难解答
图片精选