Nun, ich gehe davon aus, dass Sie keinen expliziten Verweis darauf behalten, da dies dazu führen würde, dass es zugewiesen bleibt.
Der einfachste Test, den ich mir vorstellen kann, besteht darin, viele Versprechen zu vergeben und sie nicht zu lösen:
var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
for (var i = 0; i < 100; i++) {
var $d = $q.defer();
$d.promise;
}
}, 10);
Und dann den Haufen selbst beobachten. Wie wir in den Chrome-Profiling-Tools sehen können, sammelt dies den erforderlichen Speicher, um 100 Versprechen zuzuweisen, und bleibt dann bei weniger als 15 Megabyte für die gesamte JSFIddle-Seite "dort"
Von der anderen Seite, wenn wir uns den Quellcode ansehen$q
Wir können sehen, dass es von einem globalen Punkt aus keinen Hinweis auf ein bestimmtes Versprechen gibt, sondern nur von einem Versprechen auf seine Rückrufe. Der Code ist sehr gut lesbar und klar. Mal sehen, was passiert, wenn Sie jedoch einen Verweis vom Rückruf auf das Versprechen haben.
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);
Also nach der anfänglichen Zuweisung - es scheint, dass es auch damit umgehen kann :)
Wir können auch einige interessante Muster der GC sehen, wenn wir sein letztes Beispiel noch einige Minuten laufen lassen. Wir können sehen, dass es eine Weile dauert - aber es ist in der Lage, die Rückrufe zu bereinigen.
Kurz gesagt - zumindest in modernen Browsern - müssen Sie sich keine Sorgen über ungelöste Versprechen machen, solange Sie keine externen Verweise darauf haben