Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 反应:从未调用清除函数_Javascript_Reactjs_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 反应:从未调用清除函数

Javascript 反应:从未调用清除函数,javascript,reactjs,firebase,google-cloud-firestore,Javascript,Reactjs,Firebase,Google Cloud Firestore,我正在构建一个使用Firebase和Firestore的react应用程序 我正在使用onSnapshot函数,以便从Firestore获取实时数据,但我想知道如何删除该侦听器 是的,我知道,我必须使用useEffect钩子的清理功能,但我无法让它工作,以下是我的代码: useEffect(() => { let removeListener = getCanzoni(utente).onSnapshot(function (querySnapshot) { let p

我正在构建一个使用Firebase和Firestore的react应用程序

我正在使用
onSnapshot
函数,以便从Firestore获取实时数据,但我想知道如何删除该侦听器

是的,我知道,我必须使用useEffect钩子的清理功能,但我无法让它工作,以下是我的代码:

useEffect(() => {
    let removeListener = getCanzoni(utente).onSnapshot(function (querySnapshot) {
      let promises = querySnapshot.docs.map(async function (doc) {
        let canzone = doc.data();
        canzone.id = doc.id;

        return canzone;
      });

      Promise.all(promises).then((canzoni) => {
        cambiaCanzoni(canzoni);
      });

      return function cleanup() {
        console.log("Removed Listener");
        removeListener();
      };
    });
  }, []);
getCanzoni
函数是从其他文件导入的,其定义是:

export function getCanzoni(utente) {
  return firestore
    .collection("Canzoni")
    .where("utente", "==", utente.uid)
    .orderBy("data", "desc");
}
当我删除组件时,在控制台中看不到“删除的侦听器”。 我知道,当依赖项数组更改或组件卸载时,会调用clean-up函数

有什么想法或提示吗?

我发现了错误:

清理功能必须在钩子的函数体中定义,而不是在其他函数中定义,如下所示:

  useEffect(() => {
    let removeListener = getCanzoni(utente).onSnapshot(function (querySnapshot) {
      let promises = querySnapshot.docs.map(async function (doc) {
        let canzone = doc.data();
        canzone.id = doc.id;

        return canzone;
      });

      Promise.all(promises).then((canzoni) => {
        cambiaCanzoni(canzoni);
      });
    });

    return function cleanup() {
      console.log("Tolto il listener");
      removeListener();
    };
  }, []);
我发现了错误:

清理功能必须在钩子的函数体中定义,而不是在其他函数中定义,如下所示:

  useEffect(() => {
    let removeListener = getCanzoni(utente).onSnapshot(function (querySnapshot) {
      let promises = querySnapshot.docs.map(async function (doc) {
        let canzone = doc.data();
        canzone.id = doc.id;

        return canzone;
      });

      Promise.all(promises).then((canzoni) => {
        cambiaCanzoni(canzoni);
      });
    });

    return function cleanup() {
      console.log("Tolto il listener");
      removeListener();
    };
  }, []);