【问题标题】:Nested Firestore listeners and how to unsubscribe from created listeners嵌套的 Firestore 侦听器以及如何取消订阅已创建的侦听器
【发布时间】:2020-11-09 05:58:19
【问题描述】:

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

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?借来的sn-p

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

 var unsubscribe = old_listener 

 unsubscribe = new_listener
  // would this unsubscribe old listener?
 
 

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

【问题讨论】:

  • 我正在使用 react 并认为我通过将 unsubscribe 函数存储在我的状态中得到了解决方案,该状态是用 null 变量构造的。每次触发外部侦听器时,都会调用状态,如果它为 null,则不执行任何操作,如果它包含侦听器分离函数,则取消订阅。然后用新的监听函数覆盖状态

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    firestore.collection().onSnapshot() 
    

    将返回一个取消订阅函数。声明 unsubscribe 变量并将 onSnapshot 分配给它。

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

    例如,

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

    完成后,只需退订

    unsubscribe();
    

    您可以在Firestore unsubscribe to updates找到更多示例

    【讨论】:

    • 嗨,我想我明白了。我的问题是外部侦听器每次触发时都会创建一个新的内部侦听器,并且我想在获得新的内部侦听器后取消订阅旧的内部侦听器。我不知道如何为每个创建的侦听器获取一个唯一的 const 名称
    猜你喜欢
    • 2020-07-05
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2021-07-12
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多