Node学习记录-events
来自:https://juejin.cn/post/7285915718666354723 和 https://nodejs.cn/api/events.html
Nodejs核心API都是采用异步事件驱动架构,在该架构中,某些类型的对象(触发器)触发命名事件,导致调用Function对象(监听器),就是通过有效的方法来监听事件的变化,并在变化时执行相应的动作。例如:当文件被打开时,fs.ReadStream触发一个事件;只要数据可供读取,‘流’就会触发一个事件
所有触发事件的对象都是EventEmitter类的实列,这些对象暴露了eventEmitter.on()函数,允许将一个或多个函数绑定到对象触发的命名事件,当EventEmitter对象触发事件时,将同步调用附加到该特定事件的所有函数,调用的监听器返回的任何值都将被忽略和丢弃
nodejs的事件模型
Nodejs事件模型采用了发布订阅模式(Publish-Subscribe Pattern, pub-sub),又叫观察者模式,它定义了一种一对多的关系,让多个订阅者同时监听某一个发布者
监听消息数量默认是10个
// EventEmitter 是一个允许你订阅和发布事件的类
const EventEmitter = require('events')
// 定义一个新的类继承自 EventEmitter
class MyEmitter extends EventEmitter{}
const myEmitter = new MyEmitter()
// 监听名为event的事件
myEmitter.on('event', (data)=>{
console.log('an event occurred1!', data)
})
myEmitter.on('event', (data)=>{
console.log('an event occurred2!', data)
})
myEmitter.on('event', (data)=>{
console.log('an event occurred3!', data)
})
myEmitter.on('event', (data)=>{
console.log('an event occurred4!', data)
})
myEmitter.on('event', (data)=>{
console.log('an event occurred5!', data)
})
myEmitter.on('event', (data)=>{
console.log('an event occurred6!', data)
})
myEmitter.on('event', (data)=>{
console.log('an event occurred7!', data)
})
myEmitter.on('event', (data)=>{
console.log('an event occurred8!', data)
})
myEmitter.on('event', (data)=>{
console.log('an event occurred9!', data)
})
myEmitter.on('event', (data)=>{
console.log('an event occurred10!', data)
})
// 调用.emit() 方法来触发 'event' 事件。一旦这个事件被触发,所有注册为该事件监听器的回调函数都会被执行。在这个例子中,触发事件会导致控制台输出 'an event occurred!'
myEmitter.emit('event','派发的值event data')//派发事件
myEmitter.setMaxListeners(数量)
可以通过myEmitter.setMaxListeners(数量),来解除限制
myEmitter.setMaxListeners(20)//设置最大监听器数量为20
once只监听一次
即使emit派发多次,使用once也只会监听一次
// EventEmitter 是一个允许你订阅和发布事件的类
const EventEmitter = require('events')
// 定义一个新的类继承自 EventEmitter
class MyEmitter extends EventEmitter{}
const myEmitter = new MyEmitter()
// 监听名为event的事件
myEmitter.once('event', (data) =>{
console.log('监听一次', data)
})
myEmitter.emit('event','派发的值event data')//派发事件
myEmitter.emit('event','派发的值event data1')//派发事件
off取消监听
const EventEmitter = require('events')
// 定义一个新的类继承自 EventEmitter
class MyEmitter extends EventEmitter{}
const myEmitter = new EventEmitter()
const fn = (msg) => {
console.log(msg)
}
// 监听名为event的事件
myEmitter.on('event', fn)
myEmitter.off('event', fn)//取消监听
myEmitter.emit('event','派发的值event data')//派发事件
myEmitter.emit('event','派发的值event data1')//派发事件
应用
在process中用到了events
process.once
process.on