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
? 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
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);
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.
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ń
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