已等待但从未解决/拒绝承诺内存使用[重复]

2024-04-14

Will awaiting a Promise既不解决也不拒绝(从不解决/未实现)导致内存泄漏?

在查看 React hooks 时我对此感到好奇slorber/awesome-debounce-promise https://github.com/slorber/awesome-debounce-promise这创造了新的承诺,但只解决了最后一个承诺,从而使许多/最不稳定/未实现。


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

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

Answer:

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

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

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

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

这需要在实施过程中相当小心。例如(thanks Keith https://stackoverflow.com/users/6870228/keith用于标记此),如果 Promise 使用其他 API 的回调(例如,addEventListener)并且回调会通过对 Promise 的引用而关闭,因为其他 API 具有对回调的引用,这可能会阻止对 Promise 的所有引用被释放,从而将 Promise 引用的任何内容(例如其回调)保留在记忆。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

已等待但从未解决/拒绝承诺内存使用[重复] 的相关文章