Node.JS 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.JS 使用了一个事件驱动, 非阻塞式 I/O 的模型, 使其轻量又高效.
Node.JS 是基于事件驱动和非阻塞 I/O 的方式来设计运行的, 那么作为实现事件驱动的核心模块 Events 就成了深入学习 node.JS 的关键. 在 node 中大部分的模块的实现都继承了 Events 类. 比如, 文件操作中的 fs 事件流, 网络编程所用到的 tcp,http 模块等.
Events 类
events 提供的核心 API:
on(eventName, listener) 和 emitter.addListener(eventName, listener): 对指定事件绑定事件处理函数
once(eventName, listener): 对指定事件指定只执行一次的事件处理函数
emit(eventName[, ...args]): 触发指定事件
removeListener(eventName, listener): 对指定事件解除事件处理函数
removeAllListeners([event]): 对指定的事件接触所有的事件处理函数
setMaxListeners 设置最大队列的长度
使用方法:
- const events = require('events');
- const EventsEmitter = new events();
- //=============== 事件监听部分 ===============
- EventsEmitter.on('open', function() {
- console.log('open');
- });
- EventsEmitter.on('data', function(data) {
- console.log(data);
- });
- EventsEmitter.on('error', function() {
- console.log('error');
- });
- EventsEmitter.on('end', function() {
- console.log('end');
- });
- EventsEmitter.on('close', function() {
- console.log('close');
- });
- //============= 事件触发部分 =================
- // 触发 open 事件
- EventsEmitter.emit('open');
- // 触发 data 事件, 并传递一个字符串参数'test'
- EventsEmitter.emit('data','test');
- // 触发 error 事件
- EventsEmitter.emit('error');
- // 触发 end 事件
- EventsEmitter.emit('end');
- // 触发 close 事件
- EventsEmitter.emit('close');
初始化 Events 模块
创建一个 Events 类
初始化 this.events 用来保存我们需要监听的事件
将模块导出
- class Events {
- constructor() {
- this.events = {};
- }
- }
- module.exports = Events;
实现 Events.on 方法
on 方法接收两个参数:
type: 监听的事件类型 listener: 回调函数
将对应的事件先存放在一个对象中, 分两种情况:
该事件对象不存在, 那么以 type 为 key,[listener] 为值存放在实现初始化好的 this.events 对象中 (注意这里存的是一个数组, 例如 data 事件, this.events = {data:[callback]})
如果该事件已经存在则直接 push
监听函数就这么简单的实现了, 接下来就是等着被 emit 触发了.
- /**
- * 事件监听
- * @param {*} type 监听的事件类型
- * @param {*} listener 回调函数
- */
- on(type, listener) {
- if (this.events[type]) {
- this.events[type].push(listener);
- } else {
- this.events[type] = [listener];
- }
- }
实现 Events.emit 方法
接收两个参数:
type: 要触发的事件类型
...REST: 若干个参数, 传递给对应事件的回调函数
通过 type, 在 this.events 里找到相应的事件, 这里我们上面是存成了一个数组, 里面对应的是事件的回调好书.
循环数组, 执行所有对应事件的回调.
- /**
- * 事件触发
- * @param {*} type 要触发的事件类型
- * @param {...any} REST 接收到的若干个参数, 这个参数会作为参数被传递到对应事件的回调函数中
- */
- emit(type, ...REST) {
- if (this.events[type]) {
- this.events[type].forEach(listener => {
- listener.apply(this, REST);
- });
- }
- }
来源: http://www.css88.com/qa/node-js/10812.html