Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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 一次删除多个firebase侦听器_Javascript_Firebase_React Native_Firebase Realtime Database_Google Cloud Firestore - Fatal编程技术网

Javascript 一次删除多个firebase侦听器

Javascript 一次删除多个firebase侦听器,javascript,firebase,react-native,firebase-realtime-database,google-cloud-firestore,Javascript,Firebase,React Native,Firebase Realtime Database,Google Cloud Firestore,我用react native创建了一个应用程序,面临这样一个问题:我创建了多个firebase侦听器,精确地说是在不同屏幕上创建的侦听器,以及侦听firebase数据库的侦听器和侦听firestore的其他侦听器 我想要完成的是,通过一次呼叫或必要时使用多行线路杀死所有的侦听器,但要尽可能紧凑,并且在侦听器甚至不运行的整个不同屏幕上,这一点很重要 我知道可以使用Firebase.goOffline(),但这只会断开我与Firebase的连接-它不会阻止听众。只要我再次goOnline(),监听器

我用react native创建了一个应用程序,面临这样一个问题:我创建了多个firebase侦听器,精确地说是在不同屏幕上创建的侦听器,以及侦听
firebase数据库的侦听器和侦听
firestore的其他侦听器

我想要完成的是,通过一次呼叫或必要时使用多行线路杀死所有的侦听器,但要尽可能紧凑,并且在侦听器甚至不运行的整个不同屏幕上,这一点很重要

我知道可以使用
Firebase.goOffline()
,但这只会断开我与Firebase的连接-它不会阻止听众。只要我再次
goOnline()
,监听器都回来了

我还没有从谷歌那里找到解决这个问题的方法,这就是为什么我现在要问这个问题,我想知道是否有人知道如何处理这种行为

下面的代码示例为您提供了我在应用程序中包含的侦听器,它们位于同一屏幕中,但我在其他屏幕中有几乎相同的侦听器

数据库侦听器:

const statusListener = () => {
        var partnerRef = firebase.database().ref(`users/${partnerId}/onlineState`);
        partnerRef.on('value', function(snapshot){
            setPartnerState(snapshot.val())
        })
    };
Firestore监听器:(这个很长,这只是因为我过滤了从监听器检索到的文档)

在useffect钩子中调用这两个侦听器,如下所示:(末尾带有空括号的useffect确保只调用一次而不是多次侦听器。)


所有subscribe函数都返回unsubscribe函数

const unSubscriptions = [];

... Where you subscribe
const unSub = document.onSnapshot(listener);
subscriptions.push(unSub);

... Where you unsubscribe all
function unSubAll () {
   unSubscriptions.forEach((unSub) => unSub());
   // Clear the array
   unSubscriptions.length = 0;
}

所有subscribe函数都返回unsubscribe函数

const unSubscriptions = [];

... Where you subscribe
const unSub = document.onSnapshot(listener);
subscriptions.push(unSub);

... Where you unsubscribe all
function unSubAll () {
   unSubscriptions.forEach((unSub) => unSub());
   // Clear the array
   unSubscriptions.length = 0;
}

你能添加一些代码来详细说明你是如何注册侦听器的吗?@DanielDuong当然,我刚刚添加了两个示例!一个侦听器连接到数据库,另一个连接到firestore。这里没有速记:您需要跟踪侦听器并将其删除,如两个产品(,)的文档所示。但是,如果我的侦听器位于一个聊天屏幕上,并且我想从另一个屏幕组件注销用户,该怎么办?我无法接触到两位听众。我需要在离开聊天屏幕后立即停止侦听器。我一回到屏幕,监听器就会重新激活并下载所有文件,这让我的账单变得昂贵,因为监听器第一次上网时会下载所有最近创建的20个文件。你能添加一些代码来详细说明你是如何注册监听器的吗?@DanielDuong当然,我刚刚添加了两个示例!一个侦听器连接到数据库,另一个连接到firestore。这里没有速记:您需要跟踪侦听器并将其删除,如两个产品(,)的文档所示。但是,如果我的侦听器位于一个聊天屏幕上,并且我想从另一个屏幕组件注销用户,该怎么办?我无法接触到两位听众。我需要在离开聊天屏幕后立即停止侦听器。我一回到屏幕,监听器就会重新激活并下载所有文件,这使得我的账单变得昂贵,因为监听器第一次上网时,它会下载所有最近创建的20个文件。工作正常,但有一个问题!根据它是firestore还是数据库侦听器,您需要以不同的方式停止它们。数据库使用.off(),使用firestore时,您需要像上面一样执行此操作。您的解决方案基本上只适用于firestore侦听器:)请记住,在javascript中,函数是一等公民。所以,不要取消。您可以将其推送到取消订阅阵列。取消订阅。推送(databaseRef.off);工作正常,但有一个问题!根据它是firestore还是数据库侦听器,您需要以不同的方式停止它们。数据库使用.off(),使用firestore时,您需要像上面一样执行此操作。您的解决方案基本上只适用于firestore侦听器:)请记住,在javascript中,函数是一等公民。所以,不要取消。您可以将其推送到取消订阅阵列。取消订阅。推送(databaseRef.off);
const unSubscriptions = [];

... Where you subscribe
const unSub = document.onSnapshot(listener);
subscriptions.push(unSub);

... Where you unsubscribe all
function unSubAll () {
   unSubscriptions.forEach((unSub) => unSub());
   // Clear the array
   unSubscriptions.length = 0;
}