javascript - 是否可以为数组创建 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)
}
解决方案
您可以使用get()
,它返回一个承诺并为您提供一组结果,或者您可以使用onSnapshot()
附加一个不返回承诺的持久侦听器,因为只有您可以控制侦听器何时停止。
如果你想监听多个查询的结果,你必须为每个查询添加一个监听器,当你完成监听后,在没有 Firestore SDK 返回的任何承诺的帮助下取消每个监听器的订阅. 由您决定添加和删除侦听器的时间。
推荐阅读
- reactjs - [Snowpack][Electron] 如何在渲染器进程中导入“电子”?
- java - 在 Java jar 项目中将 java 对象存储在内存中
- web - 使用 erlang yaws 服务静态网站时出错
- c++ - 如果类具有 const 成员,则将移动赋值运算符定义为删除?
- database - 如何在管理订阅计划时维护订单历史记录?
- c++ - 同时从 FFmpeg C++ 流式传输 RTP 和 RTMP。如果 RTMP 连接遇到延迟,RTP 连接会受到影响吗?
- c++ - 在 Windows 上,使用 C++,如何将文件下载到特定文件夹?
- javascript - 这些 Microsoft 文档在 JS 文件中包含 JSX 是否错误?
- reactjs - 如何从状态中获取数据
- r - 如何在 R 中提取纹理属性(Haralick)?