EventEmitter
Node.js 核心 API 都是采用异步事件驱动架构,简单来说就是通过有效的方法来监听事件状态的变化,并在变化的时候做出相应的动作。
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => { if (err) throw err; });
process.on('xxx',()=>{ })
举个例子,你去一家餐厅吃饭,这个餐厅就是一个调度中心
,然后你去点饭,可以理解注册了一个事件emit
,然后我们等候服务员的喊号,喊到我们的时候就去取餐,这就是监听了这个事件on
事件模型
Nodejs事件模型采用了,发布订阅设计模式
当一个发布者有新消息时,就将这个消息发布到调度中心。调度中心就会将这个消息通知给所有订阅者。这就实现了发布者和订阅者之间的解耦,发布者和订阅者不再直接依赖于彼此,他们可以独立地扩展自己
代码案例
const EventEmitter = require('events'); const event = new EventEmitter() //监听test event.on('test',(data)=>{ console.log(data) }) event.emit('test','xmxmxmxmx') //派发事件
监听消息数量默认是10个
const EventEmitter = require('events'); const event = new EventEmitter() event.on('test', (data) => { console.log(data) }) event.on('test', (data) => { console.log(data) }) event.on('test', (data) => { console.log(data) }) event.on('test', (data) => { console.log(data) }) event.on('test', (data) => { console.log(data) }) event.on('test', (data) => { console.log(data) }) event.on('test', (data) => { console.log(data) }) event.on('test', (data) => { console.log(data) }) event.on('test', (data) => { console.log(data) }) event.on('test', (data) => { console.log(data) }) event.on('test',(data)=>{ console.log(data) }) event.on('test',(data)=>{ console.log(data) }) event.emit('test', 'xmxmxmxmx')
如何解除限制 调用 setMaxListeners 传入数量
event.setMaxListeners(20)
只想监听一次 once 即使emit
派发多次也只触发一次once
const EventEmitter = require('events'); const event = new EventEmitter() event.setMaxListeners(20) event.once('test', (data) => { console.log(data) }) event.emit('test', 'xmxmxmxmx1') event.emit('test', 'xmxmxmxmx2')
如何取消侦听 off
const EventEmitter = require('events'); const event = new EventEmitter() const fn = (msg) => { console.log(msg) } event.on('test', fn) event.off('test', fn) event.emit('test', 'xmxmxmxmx1') event.emit('test', 'xmxmxmxmx2')
有谁用到了
process
打开nodejs 源码 搜索 setupProcessObject
这个函数
- 它首先引入 event模块
- 获取process 的原型对象
- 将evnet的原型对象设给了process 的原型对象
- 并且重新绑定上下文
- 将process 挂载到globalThis 所以我们可以全局访问这个API