Skip to content
导航

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 实现

参考资料