我有一个memoized fn,其中fn由两个输入引用记忆:
let NewRefCursor = memoized(
(deref, swap) => refToHash(deref) + refToHash(swap), // memoizer identity fn
(deref, swap) => new RefCursor(deref, swap)); // the function we are memoizing
我需要的行为是NewRefCursor(a, b) === NewRefCursor(a, b)
。当a
或b
被垃圾收集时,游标也应该被垃圾收集。
refToHash
是另一个使用ES6 WeakMap
的memoized函数,因此看到的引用仍然允许使用GC。
NewRefCursor
要记忆起来要复杂得多,因为它使用两个参数来确定缓存命中,因此与WeakMap
不兼容,因此会阻止任何从GC'编辑。我对任何欺骗行为持开放态度,将私有字段附加到输入对象,概率数据结构。这种泄漏需要解决。到目前为止,我唯一的解决方案是添加一个参数来memoize限制缓存大小,并基于每个应用程序调整该参数。毛。
答案 0 :(得分:3)
如果你创建一个两级弱映射(在弱映射上存储弱映射),每当第一级的obj被gced时,你就会失去整个第二级(当a
被gced时,你会丢失{{1} })。如果有b
,您仍然会有b
的弱图,只有在存在另一对(a
时才会出现)。不是最好的实现,但我认为它足够了:
a
这个概念可以扩展到n级解决方案。这会解决您的问题还是我错过了什么?
答案 1 :(得分:0)
请参阅https://github.com/Dans-labs/dariah/blob/master/client/src/js/lib/utils.js中的memoize 它通过构建作为对象的所有参数的WeakMap索引以通用方式解决问题。 WeakMap索引为对象分配唯一的整数,然后可以通过stringify将其与其他参数放在一起。