【问题标题】:Is resolve/reject function of promise garbage-collected after resolution/rejection?解决/拒绝后,promise 的 resolve/reject 功能是否被垃圾回收?
【发布时间】:2018-09-24 01:03:59
【问题描述】:

我正在尝试实现 RPC 代理。代理接受命令,将它们发送到 RPC 服务器,等待结果,然后将结果发送给客户端。我的做法是这样的伪代码:

function onClientCommand(cmd) {
    sendCommandToRPCServer.then(function(result){
        returnResultToClient(cmd.client,result)
    })  
}  

如您所见, sendCommandToRPCServer 返回一个承诺。我希望这个函数被非常频繁地调用(每秒数千次调用)。当系统负载过重时,RPC 服务器会变慢,Broker 内存中未解决的 Promise 会越来越多。

所以我的问题是:

如果代理在超时后拒绝承诺,这是否会从内存中删除承诺(例如,其解析和拒绝函数及其上下文,没有对该承诺的引用)?我知道我可以通过一系列回调来解决这个问题并定期清除它的旧项目,但是“类似承诺”的方法对我来说更好,因为有时代理需要等待几个 RPC 调用然后将结果返回给客户端,这更容易承诺。

【问题讨论】:

    标签: javascript node.js promise garbage-collection


    【解决方案1】:

    不,垃圾收集对他们没有任何不同。与任何其他对象一样,函数在不再引用它时会被垃圾回收。

    promise 实现中当然有一些“隐藏”的引用:

    • 解析函数(resolvereject)确实引用了承诺
    • promise 引用了所有安装在其上的 then 回调
    • 已安装的处理程序引用由then() 调用创建的承诺

    一个好的实现确实会在调用其中一个时从解析函数中删除对 Promise 的引用,并且在完成 Promise 时删除从 Promise 到处理程序的引用。

    关于您的特定用例,在等待相应响应时将解析函数存储为回调是非常好的。以this Queue implementation 为例。只需确保在使用后删除这些函数以避免内存泄漏。

    【讨论】:

    • 所以,这意味着,如果承诺在一段时间后被拒绝,那么内存最终会被释放,不是吗?
    • 是的,应该。只要确保释放存储解析函数的内存即可。
    猜你喜欢
    • 2019-01-20
    • 2023-03-17
    • 2018-10-10
    • 2020-04-15
    • 2019-04-07
    • 2018-03-14
    • 2015-01-25
    • 2020-05-01
    • 2019-04-17
    相关资源
    最近更新 更多