You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需持有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:15:05