NodeJs 之事件循环 ( EventEmiter 类)

前言

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。

上一章我们说了NodeJs几乎每一个 API 都是支持回调函数的,并且也介绍了回调函数。

Node.js 单线程类似进入一个 while(true) 的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

事件驱动程序

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。有没有觉得很熟悉,有点类似 Js的事件循环 Go Javascript 事件循环

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件

events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装

首先来说说 EventEmiter 类

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
Node.js 里面的许多对象都会分发事件, 所有这些产生事件的对象都是 events.EventEmitter 的实例。

实践一下:

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
// new 一个 EventEmiter 类
var event = new EventEmitter(); 
// 监听 some_event 
event.on('some_event', function() { 
    console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 	
	//触发 some_event
    event.emit('some_event'); 
}, 1000); 

运行这段代码,1 秒后控制台输出了 some_event 事件触发。其原理是 event对象注册了事件 some_event的一个监听器,然后我们通过 setTimeout在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用 some_event 的监听器。

其实 eventEmiter 也是可以传参数的,我们看下下边这个例子

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

结论:
1,EventEmitter 的每个事件由一个事件名和若干个参数组成
2,主要用来事件触发与事件监听

好,那么我们说回事件循环

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 定义一个处理程序函数 oneFun
function oneFun () {
  console.log("hello one");
  // 触发事件 one
  eventEmitter.emit('two');
}

// 定义一个处理程序函数 twoFun
function twoFun () {
  console.log("hello two");
}

// 监听事件 one 及事件的处理程序  oneFun
eventEmitter.on('one', oneFun);

// 监听事件 one 及事件的处理程序  oneFun
eventEmitter.on('two', twoFun);

// 触发事件 one
eventEmitter.emit('one');

运行结果

PS C:\HiSen\myWorkDemo\node_demo> node .\event_loop.js
hello one
hello two
PS C:\HiSen\myWorkDemo\node_demo>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值