Firebase实时侦听器概念?

时间:2019-04-23 21:55:39

标签: javascript firebase google-cloud-firestore

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方法附加到父集合并将其分配给变量?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

是的,根据documentation,您只需要调用该unsubscribe函数即可退订。侦听器返回的变量实际上是一个侦听器注册(有关详细信息,请参见下文),因此调用它以取消注册是有意义的。

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