我正在尝试实现RPC代理。代理接收命令,将它们发送到RPC服务器,等待结果,然后将结果发送到客户端。我的方法就像这个伪代码:
function onClientCommand(cmd) {
sendCommandToRPCServer.then(function(result){
returnResultToClient(cmd.client,result)
})
}
如您所见,sendCommandToRPCServer返回一个promise。我希望能够非常频繁地调用此函数(每秒几千个调用)。当系统负载过重时,RPC服务器变慢,并且Broker内存中会有越来越多未解决的promise。
所以我的问题是:
如果Broker在一些超时后拒绝承诺,那么这会从内存中删除promise(例如,它的上下文中的解析和拒绝函数,没有对该promise的引用)吗?我知道我可以通过一系列回调来解决这个问题,并定期清除它的旧项目,但“类似承诺”的方法对我来说更好,因为有时代理需要等待几个RPC调用,然后将结果返回给客户端,这样更容易有承诺。
答案 0 :(得分:2)
不,垃圾收集对它们没有任何不同。与任何其他对象一样,函数在没有任何引用的情况下进行垃圾收集。
当然有一些"隐藏"承诺实施中的参考:
resolve
和reject
)确实引用了承诺then
个回调then()
调用一个好的实现确实会在调用其中一个函数时从解析函数中删除对promise的引用,并且当promise被解决时它确实会从对promise的promise中删除引用。
关于您的特定用例,在等待相应响应时将解析函数存储为回调是完全正常的。请查看this Queue
implementation示例。只需确保在使用它们之后删除它们以避免内存泄漏。