相关文章
- P01: 从实用角度出发的node.js学习教程
- P02:node基本使用
- P03:node内置模块path
- P04:nodeAPI 之 Buffer
- P05:node内置模块 之 events
- P06:node内置模块 fs(1)
- P07:node内置模块 fs(2)
- P08:node实现静态服务器 ~ 创建项目
- P09:node实现静态服务器 ~ hello http
- P10:node实现静态服务器 ~ 静态读取文件或文件夹
events 事件触发器
-
events 属于内置模块
-
所有能触发事件的对象都是 EventEmitter 类的实例。
-
事件的命名通常是驼峰式的字符串,但也可以使用任何有效的 JavaScript 属性键。
-
EventEmitter 对象触发一个事件时,所有绑定在该事件上的函数都会被同步地调用。 被调用的监听器返回的任何值都将会被忽略并丢弃。
-
简单使用
// eventEmitter.on() 用于注册监听器, eventEmitter.emit() 用于触发事件 const EventEmitter = require('events') // EventEmitter继承 类 events class myEvent extends EventEmitter{} // 实例化 myEvent const myEventClick = new myEvent() // 监听myClick myEventClick.on('myClick',()=> { console.log('Click') }) setInterval(() => { // 触发myClick myEventClick.emit('myClick') }, 1000) <!-- 打印 myClick myClick myClick ... -->
-
传递参数
params
- 需要注意emit首参为触发的函数名称,后续参数均为自定义参数
- 另外需注意传参顺序,实参与形参不再敖述
// 引入内置模块 events const EventEmitter = require('events') // EventEmitter 继承 events class myEvent extends EventEmitter{} // 实例化 myEvent const ce = new myEvent() // 监听错误 传入参数 ce.on('error', (err, time) => { console.log(err) console.log(time) }) // 触发错误 ce.emit('error', new Error('error111'), Date.now()) // emit首参为触发的函数名称,后续参数均为自定义参数, /** * Error: error111 at Object.<anonymous> (E:\***\***\?$\api\04_events_param.js:15:18) ... at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3) 1574242863420 * */
-
只触发一次
once
平时实际项目中会遇到事件只触发一次的情况,使用once 即可做到。可类比与vue以及jq的once,概念大同小异const EventEmitter = require('events') // 继承EventEmitter 类 class myEvent extends EventEmitter{} const myEventClick = new myEvent() // 监听myClick myEventClick.once('myClick',()=> { console.log('Click') }) setInterval(() => { // 触发myClick myEventClick.emit('myClick') }, 1000) <!-- 只打印一次 myClick -->
-
移除事件监听函数
removeListener
removeAllListeners
removeListener
移除特定函数 需要传递监听事件以及对应的函数removeAllListeners
移除所有函数 只需要传入对应的监听事件即可
const EventEmitter = require('events') class myEvent extends EventEmitter{} const ce = new myEvent() // 事件1 function fn1() { console.log('fn1') } // 事件2 function fn2() { console.log('fn2') } // 需注意监听同一个事件,可同时触发多个函数 ce.on('click', fn1) ce.on('click', fn2) setInterval(() => { // 触发myClick ce.emit('click') }, 500) setInterval(() => { // 触发myClick ce.removeListener('click', fn2) // 全部移除 只需要传入监听的事件名 // ce.removeAllListeners('click') }, 1500) // 打印 可以再一定时段后不再打印fn2,说明已经被移除监听 /** * fn1 * fn2 * fn1 * fn2 * fn1 * fn1 * fn1 * fn1 */
close