J'ai un Promise
. Je l'ai créé pour annuler une demande AJAX si nécessaire. Mais comme je n'ai pas besoin d'annuler cet AJAX, je ne l'ai jamais résolu et AJAX s'est terminé avec succès.
Un extrait de code simplifié:
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?
Les promesses jamais résolues comme celles-là ne provoquent-elles pas des fuites de mémoire? Avez-vous des conseils sur la façon de gérer le Promise
cycle de vie?
javascript
angularjs
memory-leaks
promise
angular-promise
Umut Benzer
la source
la source
Réponses:
Eh bien, je suppose que vous ne gardez pas une référence explicite à celui-ci car cela le forcerait à rester alloué.
Le test le plus simple auquel je puisse penser consiste en fait à allouer beaucoup de promesses et à ne pas les résoudre:
Et puis regarder le tas lui-même. Comme nous pouvons le voir dans les outils de profilage de Chrome, cela accumule la mémoire nécessaire pour allouer 100 promesses, puis "y reste" à moins de 15 mégaoctets pour toute la page JSFIddle
De l'autre côté, si on regarde le
$q
code sourceNous pouvons voir qu'il n'y a pas de référence d'un point global à une promesse particulière mais seulement d'une promesse à ses rappels. Le code est très lisible et clair. Voyons ce qui se passe si vous avez cependant une référence du rappel à la promesse.
Donc, après l'allocation initiale - il semble qu'il soit également capable de gérer cela :)
Nous pouvons également voir quelques modèles intéressants de GC si nous laissons son dernier exemple fonctionner pendant quelques minutes de plus. Nous pouvons voir que cela prend un certain temps - mais il est capable de nettoyer les rappels.
En bref - du moins dans les navigateurs modernes - vous n'avez pas à vous soucier des promesses non résolues tant que vous n'avez pas de références externes à celles-ci
la source
var b = $http.get(...)
ou ajoutez-y un rappel. Cela y fait également référence. Si quelque chose le résout (comme vous l'avez dit - trop de temps à résoudre signifie toujours résoudre) - il doit y faire référence. Alors oui - ce ne sera pas GC'd