Слушатели Firestore не будут отказываться от подписки — VUE JS 3

# #javascript #firebase #google-cloud-firestore #vuejs3 #unsubscribe

Вопрос:

 //Environment:  //Vue 3 //Vite //Firebase V9 //Pinia** (For state management)  

Привет!, я просто пытаюсь отписаться от слушателей firestore от действий Pinia… по этому поводу я приведу краткий пример того, как это делается.

Поэтому сначала в моем магазине Pinia я определил свойство, в котором хранятся все прослушиватели (onSnapshot), чтобы позже получить доступ к функции отмены подписки из любой точки моего приложения.

 //Pinia store: frontDesk.ts    import {defineStore} from 'pinia'  import {db} from "/@src/firebase/config";  import { collection, query, where, onSnapshot, doc, getDoc, orderBy } from "firebase/firestore";    import {commonStore} from "/@src/stores/stores";    export const useFrontDeskStore = defineStore({  id: 'frontDesk',  state: () =gt; ({  ...    listeners: lt;anygt;{  ...  getAvailability: () =gt; null,  ...  }  }),  ...  actions: {  ...  async getAvailability() {  const q = query(collection(db, commonStore.selectedHotel, "guest", "reservations"), where('noShow', '==', false), where('cancelled', '==', false), orderBy("checkinDate", "desc"));  this.listeners.getAvailability = onSnapshot(q, (docSnapshot) =gt; {  commonStore.masterLoader = true  this.loadingAvailability = true  this.reservations.splice(0, this.reservations.length)  this.occupiedRooms.splice(0, this.occupiedRooms.length)  docSnapshot.forEach((doc) =gt; {  const data = doc.data()  if (rangesOverlaps([this.dateRange?.start, this.dateRange!.end], [firestoreToDate(data.checkinDate), firestoreToDate(data.checkoutDate)])){  this.reservations.push(data)  this.occupiedRooms.push(parseInt(data.roomNumber), ...data.extra_rooms)  }  })  this.getBlockedRooms()  commonStore.masterLoader = false  });  },  ...  }  })  

Затем, проверив неактивность пользователя, я получаю доступ к функции отмены подписки следующим образом:

 //FrontDesk.vue  //IDLE  ...  import { useIdle } from '@vueuse/core'  const { idle, lastActive } = useIdle(5000) // 5 seconds (for testing purposes)    watch(idle, val =gt; {  idleAction(val)  })    const idleAction = async (isIdle) =gt; {  if (isIdle) {  console.log("Inactivity detected, stopping listeners to save some money")  await frontDeskStore.listeners.getAvailability()  } else {  console.log("Activity detected, re-activating listeners for realtime updates")  await frontDeskStore.getAvailability()  }  }  ...  

Кажется, что все проходит без ошибок, но затем от другого клиента я вношу некоторые изменения после того, как отписка была отменена, и продолжаю получать обновления в режиме реального времени.

Есть ли что-нибудь, чего мне здесь не хватает?