我正在开发一款集成了Firebase实时数据库的Reaction应用程序,以实现实时更新.我已经实现了onValue()侦听器来获取数据并使其与我的应用程序保持同步.然而,在try 使用off()函数分离监听程序时,我遇到了"路径未定义"的错误.

以下是代码的简化版本:

  const listenerRefs = [];

  if (userInfo.chats) {
    Object.keys(userInfo.chats).forEach((value, index) => {
      const chatsRef = ref(getDatabase(), `/chatMetaData/${value}`);
      const listenerRef = onValue(chatsRef, (snapshot) => {
        // Data manipulation and state updates
      });
      listenerRefs.push(listenerRef);
    });
  }

  // Cleanup function to unsubscribe the listeners
  return () => {
    listenerRefs.forEach((listenerRef) => off(listenerRef));
  };

尽管遵循了Firebase文档,我还是遇到了"路径未定义"的错误.我怀疑我可能错误地使用了off()函数,或者为分离监听器提供了错误的引用.

有人能指导我如何正确使用Firebase实时数据库中的off()函数来分离onValue()监听程序吗?如有任何见解或建议,我们将不胜感激.谢谢!

推荐答案

函数off()接受两个可选参数:eventTypecallback.EventType是一个字符串,它指定要分离的事件类型,如valuechild_added等.回调是以前传递给on()的函数.

在您的代码中,您正在向off()函数传递一个listenerRef对象,这不是一个有效的参数.listenerRef对象包含对数据库位置和回调函数的引用,但不包含事件类型.要正确分离侦听器,需要将事件类型和回调函数都传递给off()函数. 您需要分别存储引用和回调,然后将它们与事件类型一起传递给off()函数,如下所示:

const listenerRefs = [];

if (userInfo.chats) {
  Object.keys(userInfo.chats).forEach((value, index) => {
    const chatsRef = ref(getDatabase(), `/chatMetaData/${value}`);
    const callback = (snapshot) => {};
    const unsubscribe = onValue(chatsRef, callback);
    listenerRefs.push({
      ref: chatsRef,
      callback: callback,
      unsubscribe: unsubscribe,
    });
  });
}

return () => {
  listenerRefs.forEach((listenerRef) => {
    off(listenerRef.ref, "value", listenerRef.callback);
    listenerRef.unsubscribe();
  });
};

Javascript相关问答推荐

使用jsPDF添加Image JPEG将p5.js草图画布下载为PDF

为什么我的useDispatch挂钩在这里设置不正确?

如何计算数组子级的深度- Vue.js

如何解决(不忽略)reaction详尽的linter规则,而不会在获取数据时导致无限的reender循环

在JavaScript中打开和关闭弹出窗口

在NextJS中使用计时器循环逐个打开手风琴项目?

序列查找器功能应用默认值而不是读取响应

获取加载失败:获取[.]添加时try 将文档添加到Firerestore,Nuxt 3

使用print This时, map 容器已在LeafletJS中初始化

当作为表达式调用时,如何解析方法decorator 的签名?

如何根据当前打开的BottomTab Screeb动态加载React组件?

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

material UI按钮组样式props 不反射

JavaScript不重定向配置的PATH

如何在我的Next.js项目中.blob()我的图像文件?

Vaadin定制组件-保持对javascrip变量的访问

为什么云存储中的文件不能公开使用?

AJAX POST在控制器中返回空(ASP.NET MVC)

使用父标签中的Find函数查找元素

我怎样才能得到一个数组的名字在另一个数组?