为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
相关产品推荐
相关产品推荐

