71 votes

Firebase arrête d'écouter onAuthStateChanged

Depuis la version ^3.0.0, j'ai du mal à supprimer l'écouteur de changement d'état d'authentification.

Pour démarrer le listener selon la documentation :

firebase.auth().onAuthStateChanged(function (user) {
    // handle it
});

Cependant, je ne trouve nulle part dans la documentation une référence à un écouteur de changement d'état d'authentification. Il existe une fonction particulière dans la classe Firebase.Auth appelée removeAuthTokenListener . Malheureusement, il n'est pas documenté ( référence à la documentation de firebase ).

Via la console web de votre navigateur.

var auth = firebase.auth();
auth.removeAuthTokenListener;

imprime une définition de fonction qui prend un paramètre. J'ai essayé de faire ce qui suit :

this.authListener = firebase.auth().onAuthStateChanged(function (user) {...});
firebase.auth().removeAuthTokenListener(this.authListener);

mais ça n'a rien donné.

139voto

Frank van Puffelen Points 16029

Según la documentation le onAuthStateChanged() les fonctions de retour

La fonction de désabonnement de l'observateur.

Donc tu peux juste :

var unsubscribe = firebase.auth().onAuthStateChanged(function (user) {
    // handle it
});

Et puis :

unsubscribe();

0 votes

Oh mon Dieu... je ne sais pas comment j'ai pu manquer ça. Merci.

7 votes

En fait, je ne savais pas comment cela fonctionnait, mais j'ai un peu plus d'expérience pour tirer le meilleur parti de notre documentation ;-)

7 votes

Désolé si c'est une question stupide, mais pourquoi une application aurait-elle besoin de se désabonner de cet observateur ?

4voto

theGiantOtter Points 133

Frank van Puffelen a déjà très bien répondu à cette question, mais voici mon cas d'utilisation pour les composants React qui reçoivent des données utilisateur. Ces composants doivent se désabonner lorsque le composant est démonté ou il y aura une fuite de mémoire pour chacun de ces composants.

React.useEffect(() => {
  let unsubscribe;
  const getUser = async () => {
    unsubscribe = await firebase.checkUserAuth(user => setUser(user));
  };
  getUser();
  return function cleanup() {
    unsubscribe();
  };
}, []);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X