首页 > 解决方案 > 嵌套的 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
                })
              }
            })
        })
      }
    })
}

这是从react-native 中的 Nesting firestore onSnapshot listeners借来的片段?

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

 var unsubscribe = old_listener 

 unsubscribe = new_listener
  // would this unsubscribe old listener?
 
 

如果没有,那么跟踪它们的好方法是什么?Frank 暗示使用一个有意义的列表,但我是 Javascript 初学者,不知道如何实现它。我可以将每个新侦听器附加到列表中,但是我如何将它们作为取消订阅的函数调用?

标签: javascriptfirebasereact-nativegoogle-cloud-firestore

解决方案


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


推荐阅读