capypad
0 Tage Serie
javascript / expert
Snippet

Speichereffizientes Caching mit WeakRef

WeakRef ermöglicht es, eine schwache Referenz auf ein Objekt zu halten, was bedeutet, dass es die Garbage Collection des Objekts nicht verhindert. In Kombination mit FinalizationRegistry können Caches erstellt werden, die sich bei geringem Speicher automatisch bereinigen, ohne Objekte unendlich lange am Leben zu halten.

snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const cache = new Map();
const registry = new FinalizationRegistry(key => {
const ref = cache.get(key);
if (ref && !ref.deref()) cache.delete(key);
});
 
function getCachedData(key, factory) {
const ref = cache.get(key);
let data = ref?.deref();
if (!data) {
data = factory();
cache.set(key, new WeakRef(data));
registry.register(data, key);
}
return data;
}
Erklärung
1
new WeakRef(data)
Erzeugt eine Referenz, die für den Garbage Collector nicht als Erreichbarkeit zählt.
2
ref?.deref()
Versucht auf das Objekt zuzugreifen; gibt undefined zurück, falls es bereits bereinigt wurde.
3
new FinalizationRegistry(...)
Richtet einen Callback ein, der ausgelöst wird, nachdem ein registriertes Objekt gelöscht wurde.