前言
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>