【问题标题】:Firebase Realtime Listener Concept - how to detach / unsubscribe from the listener?Firebase 实时侦听器概念 - 如何从侦听器中分离/取消订阅?
【发布时间】:2019-04-23 21:55:39
【问题描述】:

Get realtime updates with Cloud Firestore 显示如何订阅或收听文档更改。

db.collection("cities").doc("SF")
    .onSnapshot(function(doc) {
        console.log("Current data: ", doc.data());
    });

上面的例子很有意义。我的问题涉及分离听众。是否准确地说,当我们想要分离/取消订阅/取消收听文档时,我们只需再次订阅同一个数据库引用?

...看起来就是这样,但我不清楚如何/为什么?

var unsubscribe = db.collection("cities")
    .onSnapshot(function (){
      // Respond to data
      // ...
    });

// Later ...

// Stop listening to changes
unsubscribe();

这似乎是不必要的混乱。 ...为什么不简单地有两种方法,.onSnapshot.offSnapshot?我想我看到的两个提供的示例之间的唯一区别是后者被分配给一个变量,并且该方法是在整个集合而不是单个文档上调用的。

那么,底线是:要取消订阅,请将.onSnapshot 方法附加到父集合并将其分配给变量?

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    我的问题涉及分离听众。是否准确地说,当我们想要分离/取消订阅/取消收听文档时,我们只需再次订阅同一个数据库引用?

    您无需订阅两次。

    您进行的初始订阅会返回一个函数,该函数在调用时会取消您的订阅。您不会再次添加该代码,而是将初始调用集合的返回值存储到一个变量中,并在您打算取消订阅时调用它。

    想象一下这样的事情:

    function subscribe() {
      ... do things that subscribe me
      return function() {
        ... do things that unsubscribe me
      }
    }
    
    let unsubscribe = subscribe()
    
    // later when I want to unsubscribe
    unsubscribe()
    

    【讨论】:

    • 我认为你是对的。 ...不过,这种 Firebase/Firestore 方法对我来说是不必要的混乱/不直观,也就是说,.on.off 似乎更容易理解。
    • 如果你在类似的东西之前使用过间隔。在间隔中,您会得到一个间隔 id 作为返回值,为了清除间隔,您需要使用返回的那个 ID。您可以在一个页面上拥有多个间隔,就像您可以拥有多个 firebase 订阅一样。每个取消订阅功能都是唯一的,因此打开和关闭不足以描述您想要取消订阅的特定对象,而无需进行昂贵的计算。
    【解决方案2】:

    是的,根据documentation,您只需调用unsubscribe 函数即可取消订阅。您的监听器返回的变量实际上是一个监听器注册(详见下文),因此调用它来取消注册是有意义的。

    这确实很令人困惑,但是由于我在 Android 上进行了类似的设置,并且您在 Android 中取消订阅的方式是在 ListenerRegistration 实例上调用 remove() (网络中的相同取消订阅变量),我会说这只是网络的设计问题。

    【讨论】:

      猜你喜欢
      • 2021-08-30
      • 1970-01-01
      • 2020-07-05
      • 2022-01-13
      • 1970-01-01
      • 2021-07-12
      • 2020-11-09
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多