Ну, я припускаю, що ви не зберігаєте явного посилання на нього, оскільки це змусить його залишатися розподіленим.
Найпростіший тест, про який я міг подумати, насправді розподіляє багато обіцянок, а не вирішує їх:
var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
for (var i = 0; i < 100; i++) {
var $d = $q.defer();
$d.promise;
}
}, 10);
А потім спостерігає за самою купою. Як ми можемо бачити в інструментах профілювання Chrome, це накопичує необхідну пам'ять для виділення 100 обіцянок, а потім просто "залишається там" менш ніж на 15 мегабайтах для всієї сторінки JSFIddle
З іншого боку, якщо поглянути на $q
вихідний код
Ми бачимо, що з будь-якої конкретної обіцянки немає посилання з глобальної точки, а лише з обіцянки на зворотні виклики. Код дуже читабельний та зрозумілий. Давайте подивимося, що робити, якщо у вас є посилання із зворотного дзвінка на обіцянку.
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);
Тож після початкового розподілу - здається, він теж може це впоратись :)
Ми також можемо побачити кілька цікавих закономірностей GC, якщо дозволити його останньому прикладу працювати ще кілька хвилин. Ми бачимо, що це займає деякий час - але це здатне очистити зворотні дзвінки.
Коротше кажучи - принаймні в сучасних браузерах - вам не доведеться турбуватися про невирішені обіцянки, якщо у вас немає зовнішніх посилань на них