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 error
EventTarget
v15版本起,node.js 实现了浏览器全局API EventTarget,有着类似 EventEmitter 对象的功能。
Event
也是一个浏览器全局API Event 的 Node.js 实现