
AI
then 方法中传入的 resolve 和 reject 两个匿名函数被异步 IO 操作间接调用。换句话说,Promise 并不是自动完成(resolve)的,而是由异步 IO 操作显式地触发 resolve 或 reject。其次,当我们使用 awAIt 等待一个 Promise 时,实际上等价于让当前函数返回一个新的 Promise。这个新的 Promise 内部通过 resolve 间接引用了原来的 Promise。因此,一个 Promise 的引用关系可以分为两部分:一是被 awAIt 它的函数所构造的新 Promise 引用;二是由异步 IO 操作通过 resolve 或 reject 对 Promise 的引用,具体表现为以下链路: 异步 IO -> resolve/reject -> Promise从这里可以看出,除了代码中显式持有的 Promise 实例外,执行 resolve 或 reject 的地方也构成了对 Promise 的隐式引用。如果一个 Promise 始终未被解决(即处于 pending 状态),这意味着它的 resolve 或 reject 函数从未被注册到任何异步 IO 操作上。与此同时,如果像问题中的 test 函数返回的 Promise 没有被引用,那么该 Promise 的引用计数为 0,在每次 test 执行完成后便进入可回收状态。至于为什么你可能在开发者工具中看到仍有 pending 状态的 Promise,那是因为开发者工具本身对 Promise 实例保持了一个引用,从而阻止了垃圾回收机制将其销毁。无论多么复杂的异步语法,其底层实现无非是对硬件中断和回调函数的封装。如果一个代码块(对应内存地址)从未被加入硬件中断的检查队列,它就一定会被回收。这就是为什么未被引用且未完成的 Promise 最终会被系统清理的原因。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号