Ne jamais résolu promesse cause de fuite de mémoire?
J'ai un Promise
. Je l'ai créé pour annuler une requête AJAX en cas de besoin. Mais depuis je n'ai pas besoin de l'annuler AJAX, je n'ai jamais résolu et AJAX terminée avec succès.
Simplifié de l'extrait:
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?
Ne jamais résolu des promesses comme ça cause des fuites de mémoire? Avez-vous des conseils sur la façon de gérer Promise
cycle de vie?
- "Jamais résolu" promesse peut encore être "rejeté". Le mot que vous cherchez "insatisfaits".
Vous devez vous connecter pour publier un commentaire.
Bien, je suis en supposant que vous ne gardez pas une référence explicite à elle depuis que l'obligerait à rester affecté.
Le test le plus simple je pense est fait attribution d'un lot de promesses et de ne pas les résoudre:
Et puis en regardant le tas lui-même. Comme nous pouvons le voir dans le Chrome des outils de profilage, ce qui s'accumule de la mémoire nécessaire d'allouer 100 promesses et puis juste "reste là", à moins de 15 megabyes pour l'ensemble de la JSFIddle page
De l'autre côté, si l'on regarde les
$q
code sourceNous pouvons voir qu'il n'y a pas de référence à partir d'un point quelconque promesse, mais seulement à partir d'une promesse de ses rappels. Le code est très lisible et clair. Voyons ce que si vous le faites cependant disposer d'une référence à partir de la fonction de rappel de la promesse.
Ainsi, après l'attribution initiale - il me semble qu'il est capable de gérer cela en plus 🙂
Nous pouvons également voir quelques modèles intéressants de la GC, si nous laissons de son dernier exemple lancé pour quelques minutes de plus. Nous pouvons voir que cela prend du temps, mais il est capable de nettoyer les rappels.
En bref - au moins dans les navigateurs modernes - vous n'avez pas à vous soucier de suspens promet aussi longtemps que vous n'avez pas de références externes à leur
var b = $http.get(...)
ou ajouter un rappel pour elle. C'est aussi d'avoir une référence. Si quelque chose se résout (comme vous l'avez dit vous - trop long à résoudre encore les moyens de les résoudre) - il doit avoir une référence. Donc, oui - il ne sera pas GC avaisglobal.promiseState = undefined