Ce face WeakRef / FinalizationRegistry
WeakRef ține o referință la un obiect fără să-l păstreze în viață. deref() returnează obiectul dacă încă există sau undefined dacă a fost eliberat de colectorul de memorie (garbage collector).
FinalizationRegistry rulează o funcție la ceva timp după ce un obiect înregistrat cu register a fost eliberat; unregister anulează înregistrarea, folosind tokenul dat. Momentul exact nu este garantat (poate să nu vină deloc), așa că nu pune logică importantă în aceste funcții. Sunt unelte avansate, pentru cache-uri mari și resurse externe.
Parametri
| Parametru | Descriere |
|---|---|
obiect |
Obiectul urmărit. |
valoare |
Pentru register: valoarea primită de funcție după eliberare (nu obiectul însuși). |
token |
Opțional. Un obiect folosit apoi la unregister. |
Ce returnează
deref: obiectul sau undefined. unregister: true dacă a existat o înregistrare.
Exemple
Exemplul 1: O referință slabă cât timp obiectul există
let imagine = { nume: "poza-mare.jpg", octeti: 5_000_000 };
const ref = new WeakRef(imagine);
console.log(ref.deref()?.nume);
imagine = null;
console.log("după ce obiectul nu mai e folosit, deref() poate deveni undefined");
Rezultat
poza-mare.jpg
după ce obiectul nu mai e folosit, deref() poate deveni undefined
Exemplul 2: Înregistrare și anulare
const registru = new FinalizationRegistry((nume) => console.log(`${nume} a fost eliberat`));
const fisier = { nume: "raport.pdf" };
const token = {};
registru.register(fisier, fisier.nume, token);
console.log(registru.unregister(token));
console.log(registru.unregister(token));
Rezultat
true
false
Greșeli frecvente
- Te bazezi pe
FinalizationRegistryca să închizi fișiere sau conexiuni. Funcția poate rula foarte târziu sau deloc; închide resursele explicit.