首页 > 解决方案 > 是否可以为数组创建 onSnapshot 侦听器

问题描述

我有用户......每个用户都有多个他/她所属的组。每个用户组成员身份都是嵌入在他/她的用户文档中的数组。有一个任务集合,每个任务都包含一组authorizedGroups,对应于用户的组。大多数任务只有一个授权组,但有些任务有几个组。任务由一个用户分配给另一个用户。

我想查询用户可用的所有任务,并为每个查询设置监听器。

使用 get() 已经成功,但没有提供我希望的活动侦听器。有没有一种方法可以为每个组生成监听器?onSnapshot 方法不返回承诺。不清楚我如何才能实现这个目标。任何建议将不胜感激。

created() {
  const getTasksPerGroup = async (groups) => {
  // Make a get request using each group in users group membership list
     const queries = groups.map((group) => {
        return this.$store.state.db
             .collection('tasks')
             .where('authorizedGroups', 'array-contains', group)
             .where('taskAssignedTo', '==', this.$store.state.auth.user.displayName)
             .get()
      })

  // Use Await Promise.all to acquire an array of querySnapshots
  const result = await Promise.all(queries).then((querySnapshot) => {
     return querySnapshot.map((querySnapshot) => querySnapshot.docs).reduce((acc, docs) => [...acc, ...docs])})

  //Result is an array of querySnapshots...pushing each qs.data() to the tasks array
      let tasks = []
      result.forEach((qs) => {
         let item = qs.data()
         tasks.push(item)
         console.log('tasks:', tasks)
         this.$store.commit('tasks/mutate_tasksArray', tasks)
       })
 }
  // Invoke async function that gets the user's groups array
        getTasksPerGroup(this.allFirmGroups)
}

标签: javascriptvue.jsgoogle-cloud-firestore

解决方案


您可以使用get(),它返回一个承诺并为您提供一组结果,或者您可以使用onSnapshot()附加一个不返回承诺的持久侦听器,因为只有您可以控制侦听器何时停止。

如果你想监听多个查询的结果,你必须为每个查询添加一个监听器,当你完成监听后,在没有 Firestore SDK 返回的任何承诺的帮助下取消每个监听器的订阅. 由您决定添加和删除侦听器的时间。


推荐阅读