嵌套的Firestore侦听器以及如何取消订阅已创建的侦听器

时间:2020-07-20 02:07:16

标签: javascript firebase react-native google-cloud-firestore

我想使用这样的嵌套侦听器结构:

snapshotListeners() {
  firestore()
    .collectionGroup()
    .where()
    .onSnapshot({
      error: //Handle error
      next: firstSnapshot => {
        firstSnapshot.docsChanges().forEach(change => {
          //Data retrieved and used in the below query to get more data
          firestore()
            .collection()
            .where() //using the data retrived from the above query here.
            .onSnapshot({
              error: //Handle error
              next: secondSnapshot => {
                secondSnapshot.docsChanges().forEach(change =>{
                  //More Data from second query
                })
              }
            })
        })
      }
    })
}

这是从Nesting firestore onSnapshot listeners in react-native?借来的代码段

我不确定如何最好地跟踪外部侦听器触发时创建的侦听器。创建新的内部侦听器时,如何取消订阅先前的内部侦听器?覆盖旧的侦听器变量会取消订阅吗?即

 var unsubscribe = old_listener 

 unsubscribe = new_listener
  // would this unsubscribe old listener?
 
 

如果没有,那么跟踪它们的好方法是什么?弗兰克(Frank)暗示使用一个有意义的列表,但我是Java语言的初学者,不确定如何实现它。我可以将每个新的侦听器添加到列表中,但是如何将它们作为取消订阅的函数调用?

2 个答案:

答案 0 :(得分:1)

firestore.collection().onSnapshot() 

将返回一个取消订阅的函数。声明取消订阅变量,然后将onSnapshot分配给它。

之后,您可以通过调用该函数来取消订阅。

例如,

const unsubscribe = firestore.collection("collection_name")
        .onSnapshot(() => { 
// call another snapshot or handle the snapshot data
});

完成后,只需取消订阅

unsubscribe();

您可以在Firestore unsubscribe to updates

中找到更多示例

答案 1 :(得分:1)

我通过首先将var unsub声明为伪函数来解决此问题。我使用unsub = () => {}返回未定义。然后,我声明我的外部侦听器,该外部侦听器在被触发后将调用unsub,然后将unsub分配给我的新内部侦听器,即unsub = firestore().collection(..).OnSnapshot()...。这样可以确保每次外部侦听器触发时,在附加新的侦听器之前,先分离先前的内部侦听器。