Что ж, я предполагаю, что вы не сохраняете явную ссылку на него, поскольку это заставит его оставаться выделенным.
Самый простой тест, который я мог придумать, - это выделить много обещаний, а не разрешить их:
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) {
$d.promise.then(function () {
console.log($d);
});
})($d);
}
}, 10);
Итак, после первоначального распределения - похоже, что он тоже может справиться с этим :)
Мы также можем увидеть некоторые интересные паттерны GC, если мы позволим его последнему примеру поработать еще несколько минут. Мы видим, что это занимает некоторое время, но оно может очистить обратные вызовы.
Вкратце - по крайней мере, в современных браузерах - вам не нужно беспокоиться о неразрешенных обещаниях, если у вас нет внешних ссылок на них.