Dans plusieurs des didacticiels et de la documentation que j'ai lus sur les observables angulaires, j'ai vu de nombreux avertissements sur la façon dont le fait de ne pas se désabonner d'un abonnement peut créer une fuite de mémoire (à moins d'utiliser le tube async dans le modèle du composant).

J'ai des classes de support dans mon application où je crée des observables personnalisés, mais je me demandais s'il était important de se désabonner si l'observable et tous les abonnés sortaient du champ d'application. Par exemple, j'ai une classe parent qui contient une carte des objets enfants dans un tableau. Le parent souscrit à une observable pour chacun de ses enfants afin de détecter les changements dans la propriété "value", et le parent recalcule sa propriété "total" chaque fois que l'enfant change sa valeur.

Supposons ensuite que l'objet parent soit hors de portée, et que le parent et tous les enfants seront généralement récupérés tant qu'aucune référence active à l'un des enfants ne traîne. Est-il nécessaire pour le parent de se désabonner de chacun des abonnements de changement d'enfant pour que l'abonnement soit libéré? Ou est-ce que l'abonnement lui-même est récupéré lorsque les abonnés ou l'objet observé sortent de la portée? Ou est-ce que l'abonnement actif lui-même maintiendra le parent en vie, et donc tous les enfants en vie?

0
user1023110 13 avril 2020 à 20:05

2 réponses

Meilleure réponse

Dès que la source Observable est récupérée, tous les rappels d'abonnements sont également collectés, et tout l'objet référencé par les rappels donc il n'y a pas de risque réel. Tous les observables d'Angular ont leur propre cycle de vie et sont détruits lorsqu'ils ne sont plus nécessaires (HttpClient, paramètres de route, gardes, résolveurs, etc.) donc il n'y a pas besoin de s'inquiéter de unsubscribe quand vous { {X3}} à un Observable angulaire.

Les observables dangereux sont ceux que vous créez et pour lesquels vous ne gérez pas correctement le cycle de vie, ceux-ci peuvent vivre éternellement et peuvent avoir des références à des callbacks qui ont des références à des objets (comme des composants). Vous trouverez ici plus d'informations sur la façon dont les fuites de mémoire peuvent se produire: Dois-je me désabonner d'un Observable si l'Observable en a terminé avec?

0
Guerric P 13 avril 2020 à 17:23

Oui, vous devrez vous désinscrire des changements de valeur. En angular, le HttpModule est le seul que vous n'ayez pas à vous désinscrire car sa désinscription une fois la requête http terminée (dans le httpModule)

0
Talg123 13 avril 2020 à 17:21