解决/拒绝后解决/拒绝承诺垃圾收集的功能?

时间:2018-04-13 15:52:38

标签: javascript node.js promise garbage-collection

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

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

如您所见,sendCommandToRPCServer返回一个promise。我希望能够非常频繁地调用此函数(每秒几千个调用)。当系统负载过重时,RPC服务器变慢,并且Broker内存中会有越来越多未解决的promise。

所以我的问题是:

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

1 个答案:

答案 0 :(得分:2)

不,垃圾收集对它们没有任何不同。与任何其他对象一样,函数在没有任何引用的情况下进行垃圾收集。

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

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

一个好的实现确实会在调用其中一个函数时从解析函数中删除对promise的引用,并且当promise被解决时它确实会从对promise的promise中删除引用。

关于您的特定用例,在等待相应响应时将解析函数存储为回调是完全正常的。请查看this Queue implementation示例。只需确保在使用它们之后删除它们以避免内存泄漏。