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
方法附加到父集合并将其分配给变量?
答案 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()(网络上相同的取消订阅变量),因此会说这只是网络上的设计问题。