首页 > 语言 > JavaScript > 正文

详解Node.js:events事件模块

2024-05-06 15:06:22
字体:
来源:转载
供稿:网友

Nodejs的大部分核心API都是基于异步事件驱动设计的,所有可以分发事件的对象都是EventEmitter类的实例。

大家知道,由于nodejs是单线程运行的,所以nodejs需要借助事件轮询,不断去查询事件队列中的事件消息,然后执行该事件对应的回调函数,有点类似windows的消息映射机制。至于更细的实现环节,可以另行查找资料。

下面介绍EventEmitter的使用。

1、监听事件和分发事件

EventEmitter实例可以使用onaddListener监听事件,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});            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选