一、自定义事件
1.1、自定义事件创建(node事件原理)
// 自定义一个事件对象
let readThing ={
// 用来放置事件的对象
event: {},
// 用来定义事件
// 参数:eventName --》 事件名, eventFn --》 事件
on: function(eventName, eventFn) {
if(this.event[eventName]) {
this.event[eventName].push(eventFn)
}else {
this.event[eventName] = []
this.event[eventName].push(eventFn)
}
},
// 用来循环使用这个定义的事件
// 参数:eventName --》 事件名, data --》 一些事件的数据
emit: function(eventName, data) {
if(this.event[eventName]) {
this.event[eventName].forEach(element => {
element(data)
});
}
}
}
1.2、自定义事件使用的实例
let fs = require('fs')
// 1. 自定义一个事件对象
// 参数:eventName --》 事件名, eventFn --》 事件
let readThing ={
// 用来放置事件的对象
event: {},
// 用来定义事件
on: function(eventName, eventFn) {
if(this.event[eventName]) {
this.event[eventName].push(eventFn)
}else {
this.event[eventName] = []
this.event[eventName].push(eventFn)
}
},
// 用来循环使用这个定义的事件
// 参数:eventName --》 事件名, data --》 一些事件的数据
emit: function(eventName, data) {
if(this.event[eventName]) {
this.event[eventName].forEach(element => {
element(data)
});
}
}
}
// 2. 将要做的事情,定义成事件
readThing.on('fileSuccess', () => {
console.log('1 数据库查看信息')
})
readThing.on('fileSuccess', () => {
console.log('2 统计年龄比例')
})
readThing.on('fileSuccess', () => {
console.log('3 查看用户信息')
})
fs.readFile('hello.txt', {flags: 'r', encoding: 'utf-8'}, (err, data) => {
if(err) {
console.log('出错')
}else {
console.log(data)
// 1 数据库查看信息
// 2 统计年龄比例
// 3 查看用户信息
// 3. 触发以上定义的事件
readThing.emit('fileSuccess', data)
}
})
二、Node事件模块
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 几乎每一个 API 都是支持回调函数的。
2.1、模块对象events
// 引入 events 模块
var events = require('events');
2.2、使用 eventEmitter
对象
其实总体步骤跟 自定义事件一样,只不过node
已经帮我们定义好了事件对象
let fs = require('fs')
// 引入 event 模块
let events = require('events');
// 1. 创建 eventEmitter 对象
let eventEmitter = new events.EventEmitter();
// 2. 将要做的事情,定义成事件
eventEmitter.on('fileSuccess', () => {
console.log('1 吃夜宵')
})
eventEmitter.on('fileSuccess', () => {
console.log('2 唱K')
})
eventEmitter.on('fileSuccess', () => {
console.log('3 打王者')
})
// 也可以封装成Promise的方式,使用async/await会更加简洁
fs.readFile('hello.txt', {flags: 'r', encoding: 'utf-8'}, (err, data) => {
if(err) {
console.log('出错')
}else {
console.log(data)
// 3. 触发以上定义的事件
eventEmitter.emit('fileSuccess')
}
})