是否可以为数组创建onSnapshot侦听器

时间:2019-08-07 00:24:51

标签: javascript vue.js google-cloud-firestore

我有用户...每个用户都有他/她所属的多个组。每个用户组成员资格都是嵌入在其用户文档中的数组。有一个任务集合,每个任务包含一个与用户组相对应的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)
}

1 个答案:

答案 0 :(得分:1)

您可以使用@IBAction func shareButtonTapped(_ sender: UIButton) { if let post = myTextField.text { let user = Auth.auth().currentUser if let user = user { let userID = Auth.auth().currentUser!.uid dataRef?.child("Users/\(userID)/Account/").updateChildValues(["Comment":post]) let alert = UIAlertController(title: "Message", message: "Comment Posted !", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil)) self.myTextField.text = "" present(alert, animated: true) } } } 返回一个Promise并给您一组结果,也可以使用get()附加一个持久性侦听器,该侦听器不返回Promise,因为只有您自己可以控制侦听器何时停止。

如果您想收听多个查询的结果,则必须为每个查询添加一个侦听器,当您侦听完后,无需任何其他返回的promise即可从每个侦听器中取消订阅该侦听器。 Firestore SDK。由您决定添加和删除侦听器的时间。