events 模块
Node.js 同 JS 一样是事件驱动的。在Node.js中,所有的事件监听器都是存储在事件触发器上的,而所有的事件触发器都是 events 模块导出类的实例。
基本用法
实例对象暴露了 eventEmitter.on() 函数,允许将一个或多个函数绑定到对象触发的命名事件。
常用API:
eventEmitter.on()用于注册监听器。别名addListener()eventEmitter.off()用于从事件名的监听器数组中,移除监听器。别名removeListener()eventEmitter.once()监听事件一次。事件触发后,监听器将被取消注册,然后被调用eventEmitter.emit()用于同步地触发事件
js
import EventEmitter from 'node:events'
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter()
myEmitter.on('event', () => {
console.log('an event occurred!')
})
myEmitter.emit('event')监听错误
同步错误
events 模块的事件监听函数中发生同步错误,如果没有捕获,最终会导致node.js应用结束运行。
捕获同步错误的方法与捕获node.js应用同步代码报错的方法相同,即 uncaughtException 。
异步错误
events 模块的事件监听函数中发生异步错误,如果没有捕获,最终会导致v14以上版本的node.js应用结束运行。
捕获异步错误的方法与捕获node.js应用异步代码报错的方法相同,即 unhandledRejection 。
除此之外,还可以设置 EventEmitter.captureRejections = true,结合监听 error 事件,来捕获异步错误。示例代码如下
js
import { EventEmitter } from "node:events"
EventEmitter.captureRejections = true
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter()
myEmitter.on('test', async ()=>{
throw new Error('test error')
})
myEmitter.on('error', (err)=>{
console.log('error happened:', err.message)
})
myEmitter.emit('test') // error happened: test errorEventTarget
v15版本起,node.js 实现了浏览器全局API EventTarget,有着类似 EventEmitter 对象的功能。
Event
也是一个浏览器全局API Event 的 Node.js 实现