Bene, presumo che tu non mantenga un riferimento esplicito ad esso poiché ciò costringerebbe a rimanere assegnato.
Il test più semplice a cui potrei pensare è in realtà allocare molte promesse e non risolverle:
var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
for (var i = 0; i < 100; i++) {
var $d = $q.defer();
$d.promise;
}
}, 10);
E poi guardando il mucchio stesso. Come possiamo vedere negli strumenti di profilazione di Chrome, questo accumula la memoria necessaria per allocare 100 promesse e quindi "rimane lì" a meno di 15 megabyes per l'intera pagina JSFIddle
Dall'altro lato, se guardiamo il $q
codice sorgente
Possiamo vedere che non c'è alcun riferimento da un punto globale a una particolare promessa, ma solo da una promessa ai suoi richiami. Il codice è molto leggibile e chiaro. Vediamo cosa succede se hai comunque un riferimento dalla richiamata alla promessa.
var $q = angular.injector(["ng"]).get("$q");
console.log($q);
setInterval(function () {
for (var i = 0; i < 10; i++) {
var $d = $q.defer();
(function ($d) { // loop closure thing
$d.promise.then(function () {
console.log($d);
});
})($d);
}
}, 10);
Quindi, dopo l'assegnazione iniziale, sembra che sia in grado di gestire anche quello :)
Possiamo anche vedere alcuni modelli interessanti di GC se lasciamo che il suo ultimo esempio continui per qualche minuto in più. Possiamo vedere che ci vuole un po ', ma è in grado di pulire i callback.
In breve, almeno nei browser moderni, non devi preoccuparti di promesse irrisolte fintanto che non hai riferimenti esterni ad esse