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

为EventEmitter传入异步回调时返回的Promise是否会被垃圾回收?

相关代码示例:

const emitter = new EventEmitter();
emitter.on('event', async (e) => {
  await sendData(e);
  updateUI();
});

问题1:若sendData延迟过高,异步回调返回的Promise是否会被垃圾回收,导致updateUI永远不会执行?

这个猜测没有依据。
处于pending状态的Promise本身会被JavaScript引擎/Node.js宿主持有引用:sendData触发的异步操作(如网络请求、IO操作)由宿主直接管理,只要异步操作未完成、Promise还处于pending状态,整个async函数的回调链(包括await后的updateUI逻辑)都不会被垃圾回收。
EventEmitter同步调用监听器的特性仅决定监听器会在emit触发的同步阶段执行,async函数执行后返回的Promise即使没有手动赋值存储,也不会在pending阶段被回收,不管sendData延迟有多高,只要它的Promise最终决议,后续的updateUI一定会执行。

问题2:开启Promise拒绝捕获的实验性API后,EventEmitter实例会持有所有Promise引用、导致Promise无法被垃圾回收吗?

不会。
该API的作用是捕获监听器返回的Promise的未处理拒绝,统一通过error事件抛出。开启功能后,EventEmitter仅会临时持有未决议的Promise引用,直到Promise状态变更:

  • 若Promise变为fulfilled状态,引用会立刻释放
  • 若Promise变为rejected状态,引用会在触发完error事件监听器后释放
    只要没有其他逻辑持有该Promise的引用,它在决议后就会被正常垃圾回收,不会被EventEmitter永久占用。

内容的提问来源于stack exchange,提问作者Ilya Loskutov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:09:00