Czy obietnica nigdy nie rozwiązana powoduje wyciek pamięci?

Mam Promise. Stworzyłem go, aby anulować żądanie AJAX w razie potrzeby. Ale ponieważ nie muszę anulować AJAX, nigdy go nie rozwiązałem i AJAX zakończył się pomyślnie.

Uproszczony fragment:

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?
Czy takie obietnice nigdy nie powodują wycieków pamięci? Czy masz jakieś rady jak zarządzać cyklem życia Promise?
Author: Alexander Abakumov, 2013-11-19

1 answers

Zakładam, że nie masz do niego wyraźnego odniesienia, bo to zmusiłoby go do pozostania przydzielonym.

Najprostszym testem, jaki mogłem wymyślić, jest przydzielanie wielu obietnic, a nie ich rozwiązywanie:

var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
    for (var i = 0; i < 100; i++) {
        var $d = $q.defer();
        $d.promise;
    }
}, 10);

A potem obserwowanie samej sterty. Jak widać w narzędziach do profilowania Chrome, gromadzi to potrzebną pamięć, aby przydzielić 100 obietnic, a następnie po prostu "zostaje" na mniej niż 15 megabyes dla całego JSFIddle Strona

Tutaj wpisz opis obrazka

Z drugiej strony, jeśli spojrzymy na $q Kod źródłowy

Widzimy, że nie ma odniesienia z punktu globalnego do żadnej konkretnej obietnicy, ale tylko z obietnicy do jej wywołań zwrotnych. Kod jest bardzo czytelny i przejrzysty. Zobaczmy, co jeśli jednak masz odniesienie oddzwaniania do obietnicy.

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);

Tutaj wpisz opis obrazka

Więc po wstępnej alokacji-wydaje się, że jest w stanie poradzić sobie z tym, jak również :)

Możemy również zobaczyć kilka ciekawych wzorów GC, jeśli pozwolimy, aby jego ostatni przykład trwał jeszcze kilka minut. Widać, że zajmuje to trochę czasu - ale jest w stanie wyczyścić wywołania zwrotne.

Tutaj wpisz opis obrazka

Krótko mówiąc-przynajmniej w nowoczesnych przeglądarkach-nie musisz się martwić o nierozwiązane obietnice, dopóki nie masz do nich zewnętrznych odniesień

 131
Author: Benjamin Gruenbaum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-19 10:23:50