Никогда не выполненное обещание вызывает утечку памяти?

У меня есть Promise. Я создал его, чтобы отменить запрос AJAX, если это необходимо. Но так как мне не нужно отменять этот AJAX, я никогда не разрешал его, и AJAX успешно завершился.

Упрощенный фрагмент:

var defer = $q.defer();
$http({url: 'example.com/some/api', timeout: defer.promise}).success(function(data) {
    // do something
});

// Never defer.resolve() because I don't need to cancel that ajax. What happens to this promise after request?

Никогда не выполняются такие обещания, которые вызывают утечку памяти? Есть ли у вас какие-либо советы о том, как управлять жизненным циклом Promise?

Ответ 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

enter image description here

С другой стороны, если мы посмотрим на $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);

enter image description here

Итак, после первоначального выделения - похоже, что он способен справиться и с этим:)

Мы также можем увидеть некоторые интересные шаблоны GC, если мы позволим, чтобы его последний пример выполнялся еще несколько минут. Мы можем видеть, что это занимает некоторое время - но он способен очищать обратные вызовы.

enter image description here

Короче говоря, по крайней мере, в современных браузерах - вам не нужно беспокоиться о неразрешенных promises, если у вас нет внешних ссылок на них