Mi ejemplo de código se parece a lo siguiente:
useEffect(() => { specialfunction();//listener for chat operations }, []); const specialfunction = async() => { var mylistener = firebase.firestore()...onSnapshot((snapshot) => { //do something with the docs retrieved }); //my unlucky try to remove the listener after I leave the screen return () => { try{ mylistener(); console.log("LISTENER REMOVED") }catch(error){console.log(error)}; } };Por lo general, si desea eliminar un oyente de Firestore, simplemente llame a la variable a la que lo adjuntó, en mi ejemplo, 'mylistener ()'. Desafortunadamente, mi oyente no se detiene. Después de salir de la pantalla y volver a entrar varias veces y recibir un documento, noto que mi oyente dispara varias veces. Tampoco puedo detenerlo fuera de mi 'función especial' porque no es un oyente de base de datos donde solo puedo llamar a la referencia nuevamente y detenerlo, se trata de un oyente de Firestore aquí.
Tampoco puedo poner 'mylistener' fuera de la 'función especial', debe permanecer dentro.
¿Pueden ayudarme a detener 'mylistener' después de salir de la pantalla?
No estoy particularmente bien versado en firebase pero si desea eliminar el detector de eventos cuando se trata del gancho useEffect , la plantilla debería ser la siguiente
useEffect(() => { window.addEventListener("keyup", handleKeyUp) return () => window.removeEventListener("keyup", handleKeyUp) }, [collapsed, handleKeyUp]) Tenga en cuenta que en su gancho useEffect necesita return una función que elimine el detector de eventos
La clave para esta solución fue otra publicación pero bajo un tema diferente . Es importante entender que debe predefinir una variable y luego sobrescribirla con el oyente de Firestore. En este caso, podrá separar el oyente en la parte de retorno del 'useEffect'-Hook una vez que salga de la pantalla, el código se ve así ahora:
let mylistener; useEffect(() => { specialfunction();//listener for chat operations return () => { try{ mylistener(); //here you need to remove the listener console.log("LISTENER REMOVED") }catch(error){console.log(error)}; } }, []); const specialfunction = async() => { var mylistener = firebase.firestore()...onSnapshot((snapshot) => { //do something with the docs retrieved }); };Además, la 'función especial' no necesita ser asíncrona, pero hago llamadas asíncronas dentro de esta función, depende de usted.