Nodejs 第十七章(events)

EventEmitter

Node.js 核心 API 都是采用异步事件驱动架构,简单来说就是通过有效的方法来监听事件状态的变化,并在变化的时候做出相应的动作。

js 复制代码
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});
js 复制代码
process.on('xxx',()=>{

})

举个例子,你去一家餐厅吃饭,这个餐厅就是一个调度中心,然后你去点饭,可以理解注册了一个事件emit,然后我们等候服务员的喊号,喊到我们的时候就去取餐,这就是监听了这个事件on

事件模型

Nodejs事件模型采用了,发布订阅设计模式

当一个发布者有新消息时,就将这个消息发布到调度中心。调度中心就会将这个消息通知给所有订阅者。这就实现了发布者和订阅者之间的解耦,发布者和订阅者不再直接依赖于彼此,他们可以独立地扩展自己

代码案例

js 复制代码
const EventEmitter = require('events');

const event = new EventEmitter()
//监听test
event.on('test',(data)=>{
    console.log(data)
})

event.emit('test','xmxmxmxmx') //派发事件

监听消息数量默认是10个

js 复制代码
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 传入数量

js 复制代码
event.setMaxListeners(20)

只想监听一次 once 即使emit派发多次也只触发一次once

js 复制代码
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

js 复制代码
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 这个函数

  1. 它首先引入 event模块
  2. 获取process 的原型对象
  3. 将evnet的原型对象设给了process 的原型对象
  4. 并且重新绑定上下文
  5. 将process 挂载到globalThis 所以我们可以全局访问这个API
相关推荐
jay神25 分钟前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
屏什么录27 分钟前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
code_Bo1 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen1 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
涛涛ing2 小时前
2026年最值得关注的前端变化,藏在“默认值”里
前端
亿元程序员4 小时前
太牛了!这AI做出来的游戏,居然还能变现!
前端
hellice4 小时前
闪传 FlashDrop 实战:我用 300 行 Node 代码做了个「4 位取件码」临时文件中转站
前端·产品
用户0829773260054 小时前
RTX 5500 MIG 踩坑记录:切分之后模型跑不起来,排错整整一下午
前端
Lank_M4 小时前
AI 放大后的图更清楚,但它不能当原图入库
前端
Swot5 小时前
SvelteKit 数据流研究:`+page.js` 和 `+page.server.js` 到底谁在跑,数据又去了哪儿
前端·后端