我正在为应用程序的特定页面上的更新设置侦听器。我需要当用户离开页面时,他们将退订该页面的更新。
从我正在阅读的内容中,我只是称呼刚刚设置为函数的监听器?没有实际调用某种方法似乎很奇怪。我本来不会介意的,但是我无法使其正常工作。
文档给出了如何取消订阅的示例:
var unsubscribe = db.collection("cities")
.onSnapshot(function (){
// Respond to data
// ...
});
// Later ...
// Stop listening to changes
unsubscribe();
我又觉得有点奇怪,因为unsubscribe
是侦听器本身。将其称为s函数以使侦听器停止似乎有点直观。
无论如何,这就是我的听众的设置方式。
首先,我只是在所有函数之外声明它:
let multiverseListener;
然后我有一个功能,可以根据我所在的页面(房间)开始收听:
multiverseListener = db
.collection("multiverses")
.doc(roomID)
.onSnapshot((docMultiverse) => {
if (docMultiverse.data()) {
setMultiverse(docMultiverse.data());
const arrayVerse = Object.values(docMultiverse.data());
console.log(arrayVerse);
setMultiverseArray(arrayVerse.sort(compare));
} else {
newPortal();
}
});
然后,在用户离开页面时调用的另一个函数上,我执行以下操作:
export const detachListener = () => () => {
if (multiverseListener) multiverseListener();
};
但是它并没有完全阻止它。即使返回首页,我仍会不断获取该页面的更新。
我也尝试过multiverseListener.remove()
,但收到一条错误消息,说它不是可用的方法