EventEmitter 是 Node.js 事件驱动的核心,基于发布 - 订阅模式工作。它内部维护了一个事件映射表,键是事件名称,值是对应的回调函数队列。我们用on方法注册事件监听,把回调函数存入对应队列;调用emit方法触发事件时,会遍历该事件的所有回调并同步执行。它还提供了once(只执行一次)、off(移除监听)、removeAllListeners等方法。如果触发error事件没有监听,会直接抛出异常终止程序。所有能触发事件的对象,都是 EventEmitter 的实例,它是 Node.js 处理异步事件的基础工具。
实现自定义事件非常简单,核心是继承或直接使用 EventEmitter。首先引入events模块,创建 EventEmitter 实例;也可以自定义类继承它,让对象具备事件能力。用on或addListener方法绑定自定义事件名和回调函数,支持传递多个参数;需要触发时,调用emit方法并传入事件名和参数即可。还能用once绑定单次执行的监听,off移除不需要的监听。这种方式无侵入性,能轻松实现模块间解耦通信,是 Node.js 自定义事件的标准用法,几行代码就能完成。
Promise 是处理异步的标准化对象,是基础;Async/Await 是基于 Promise 的语法糖,写法更简洁。Promise 用.then()链式调用处理结果,.catch()捕获错误,优点是标准化、支持并行处理,缺点是链式过长仍有可读性问题。Async/Await 用同步写法写异步代码,配合try/catch捕获错误,优点是逻辑清晰、易调试,代码扁平化。缺点是必须包裹在async函数中,无法单独使用,且串行写法会降低并发效率。两者互补:Promise 适合并行异步,Async/Await 适合串行流程,是目前 Node.js 异步编程的最佳组合。
错误优先回调是 Node.js原生异步 API 的标准回调规范,核心规则:回调函数的第一个参数固定为错误对象,操作成功则为null,后续参数才是返回的数据。比如 fs 文件操作、网络请求的原生回调都遵循这个模式。它的优势是统一了错误处理方式,开发者先判断 error 是否存在,再处理业务数据,避免遗漏错误。但缺点也很明显,多层嵌套会形成回调地狱,可读性差。现在虽被 Promise/async-await 替代,但它是 Node.js 异步编程的基础,理解它能更好兼容老代码和原生模块。
异步钩子是 Node.js 的async_hooks内置模块,用来追踪所有异步资源的生命周期。它提供了四个核心钩子:初始化(异步资源创建)、回调前、回调后、销毁(资源释放)。工作时,每个异步操作(Promise、定时器、I/O)都会生成唯一 ID,钩子会监听该 ID 的全生命周期。它不会影响业务代码执行,仅做追踪监控,常用于调试异步泄漏、链路追踪、性能监控、日志埋点。异步钩子是 Node.js 底层调试的利器,能精准捕捉异步操作的执行过程,解决异步代码难以追踪的痛点。