无需持有Promise变量检测Node.js进程内待处理/运行中Promise的方法
结论
Node.js v16及以上稳定版本已经有成熟的可行方案,完全可以满足你提出的三个需求,核心依赖Node内置的async_hooks模块实现,无需持有任何Promise实例即可完成全局检测和统计。
实现原理
async_hooks是Node官方提供的用于追踪异步资源全生命周期的内置模块,Promise属于被追踪的异步资源类型之一,类型标识为PROMISE。通过监听Promise的初始化、销毁事件,即可统计全局所有处于pending状态的Promise数量。
示例代码
const async_hooks = require('async_hooks'); // 存储所有 pending 状态 Promise 的异步资源ID const pendingPromiseIds = new Set(); // 创建异步资源监听钩子 const promiseHook = async_hooks.createHook({ // 异步资源初始化时触发 init(id, type) { if (type === 'PROMISE') { pendingPromiseIds.add(id); } }, // 异步资源销毁时触发(Promise被resolve/reject后触发) destroy(id) { pendingPromiseIds.delete(id); } }); // 开启监听 promiseHook.enable(); // 暴露校验方法:判断是否存在待处理Promise function hasPendingPromise() { return pendingPromiseIds.size > 0; } // 暴露统计方法:获取全局待处理Promise总数 function getPendingPromiseCount() { return pendingPromiseIds.size; } // 不需要监听时可调用该方法关闭,减少性能损耗 function stopTracking() { promiseHook.disable(); pendingPromiseIds.clear(); }
注意事项
- 该方案仅适用于Node.js环境,浏览器端无对等内置能力
- 统计范围包含Node内部逻辑、第三方依赖、业务代码产生的所有pending状态Promise,若需要仅统计业务代码产生的Promise,可在
init钩子中结合调用栈信息做过滤 async/await语法产生的隐性Promise也会被纳入统计,完全覆盖全局所有作用域的Promise
内容的提问来源于stack exchange,提问作者LaVache
相关产品推荐
相关产品推荐

