Javascript 承诺垃圾的解析/拒绝功能是否在解析/拒绝后收集?

Javascript 承诺垃圾的解析/拒绝功能是否在解析/拒绝后收集?,javascript,node.js,promise,garbage-collection,Javascript,Node.js,Promise,Garbage Collection,我正在尝试实现RPC代理。代理接收命令,将其发送到RPC服务器,等待结果,然后将结果发送到客户端。我的方法是这样的伪代码: function onClientCommand(cmd) { sendCommandToRPCServer.then(function(result){ returnResultToClient(cmd.client,result) }) } 如您所见,sendCommandToRPCServer返回一个承诺。我希望这个函数被频繁

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

function onClientCommand(cmd) {
    sendCommandToRPCServer.then(function(result){
        returnResultToClient(cmd.client,result)
    })  
}  
如您所见,sendCommandToRPCServer返回一个承诺。我希望这个函数被频繁调用(每秒数千次调用)。当系统负载过重时,RPC服务器速度会变慢,代理内存中会有越来越多未解决的承诺

所以我的问题是:


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

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

承诺实施中当然有一些“隐藏”的参考:

  • 解析函数(
    解析
    拒绝
    )确实引用了承诺
  • 承诺引用所有
    然后安装在其上的
    回调
  • 已安装的处理程序引用由
    then()
    调用创建的承诺
一个好的实现确实会在调用解析函数之一时将引用从解析函数中移除到承诺,并且在解决承诺时将引用从承诺中移除到处理程序


关于您的特定用例,在等待相应的响应时将解析函数存储为回调是非常好的。请看一个例子。只需确保在使用函数后删除它们,以避免内存泄漏。

因此,这意味着,如果承诺在一段时间后被拒绝,内存最终将被释放,不是吗?是的,应该是这样。只需确保释放存储解析函数的内存即可。