javascript - 已等待但从未解决/拒绝 promise 内存使用

标签 javascript async-await es6-promise

威尔await正在寻找Promise既不解决也不拒绝(从不解决/未实现)导致内存泄漏?

我在查看带有 slorber/awesome-debounce-promise 的 React hooks 时对此感到好奇。这创造了新的 promise ,但只解决了最后一个 promise ,从而留下许多/最不稳定/未实现的。

最佳答案

前言(你可能知道这一点!):

await 是使用 Promise 回调的语法糖。 (真的,真的,真的很好的糖。) async 函数是 JavaScript 引擎为您构建 promise 链等的函数。

答案:

相关的事情并不在于 Promise 是否已解决,而是 Promise 回调(以及它们引用/结束的事物)是否保留在内存中。虽然 Promise 位于内存中且尚未解决,但它具有对其回调函数的引用,并将它们保留在内存中。有两件事使这些引用消失:

  1. 兑现 promise ,或者
  2. 释放对 Promise 的所有引用,使其符合 GC 条件(可能会在下面详细介绍)

在正常情况下, promise 的使用者将处理程序连接到 promise ,然后要么根本不保留对它的引用,要么只在处理程序函数关闭的上下文中保留对它的引用不在其他地方。 (例如,而不是将 promise 引用保留在长期存在的对象属性中。)

假设去抖实现释放了它对永远不会解决的 promise 的引用,并且 promise 的使用者没有在此相互引用周期之外的某个地方存储引用,那么 promise 和处理程序注册到它(一旦对 Promise 的引用被释放,它们持有唯一引用的任何内容都可以被垃圾收集。

这需要在实现过程中相当小心。例如(感谢 Keith 对此进行标记),如果 Promise 使用某个其他 API 的回调(例如,addEventListener)并且回调通过引用关闭到 Promise,因为其他 API 具有对回调的引用,这可能会阻止释放对 Promise 的所有引用,从而将 Promise 引用的任何内容(例如其回调)保留在内存中。

因此,这将取决于实现的谨慎程度,以及消费者的态度。可以编写保留对 promise 的引用的代码,从而导致内存泄漏,但在正常情况下,我不希望消费者这样做。

关于javascript - 已等待但从未解决/拒绝 promise 内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57412416/

相关文章:

javascript - Electron defaultConfig 没有 "app"参数

javascript - Node-mysql pool.query 在 10 分钟查询后断开连接

javascript - 将 key 作为特殊字符发送

javascript - 使用async/await进行同步代码执行时, "sync-ify"第三方代码怎么办?

c# - 任务继续多个任务

javascript - 异步函数 promise 何时解决?

node.js - 如何将 http 模块与 bluebird 协程一起使用?

javascript - 显示带反斜杠的路径(javascript)

javascript - es6 类 : Fetch in the parent class, 指的是子类中已解析的提取

javascript - 使用 async/await 在 fs.writeFile 之后执行代码