Ответ 1
Хорошо, я предполагаю, что вы не держите явной ссылки на него, поскольку это заставит его оставаться выделенным.
Простейший тест, о котором я мог думать, на самом деле выделяет много promises и не решает их:
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 promises, а затем просто "остается там" менее чем за 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, если мы позволим, чтобы его последний пример выполнялся еще несколько минут. Мы можем видеть, что это занимает некоторое время - но он способен очищать обратные вызовы.
Короче говоря, по крайней мере, в современных браузерах - вам не нужно беспокоиться о неразрешенных promises, если у вас нет внешних ссылок на них