Ну, я предполагаю, что вы не держите явной ссылки на него, поскольку это заставит его оставаться выделенным.
Самый простой тест, который я мог думать на самом деле распределения много обещаний и не решить их:
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 megabyes для всей JSFIddle page
С другой стороны, если мы посмотрим на $q
source code
Мы можем видеть, что нет ссылки с глобальной точки на какие-либо конкретные обещания, а только на обещание ее обратных вызовов. Код очень читабельны и понятны. Посмотрим, что, если у вас все же есть ссылка от обратного вызова к обещанию.
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, если мы позволим его последний пример перспективе еще несколько минут. Мы видим, что это занимает некоторое время, но он способен очищать обратные вызовы.
Короче - по крайней мере в современных браузерах - вам не придется беспокоиться о неразрешенных обещании до тех пор, пока вы не имеете внешние ссылки на них
большого ответа !!! –
Разве это не означает, что если обещание слишком долго для решения (но в конечном итоге будет разрешено), это может быть GC'd? –
@ w.brian Я написал: «Я предполагаю, что вы не держите явной ссылки на него, поскольку это заставит его оставаться выделенным». Как вы думаете, я должен прояснить это? (ps вы не подвергаетесь риску) –