Firebase:返回所有在数组中具有ID的集合项,以便执行onSnapshot

时间:2019-07-12 21:20:48

标签: javascript firebase firebase-realtime-database

这应该是一个简单的查询,但是我似乎无法使其正常运行或找到如何完成它的方法。

我在数组中列出了某个集合的可接受ID。我想对该集合中与其中一个ID匹配的每个项目执行get。有点像常用array-contains的相反。例如:

const acceptableIds = ['id1', 'id2', 'id3']

const myCollectionDispose = await db
    .collection('myCollection')
    .where('id', 'is-in-array', acceptableIds)
    .onSnapshot(doSomething)

我知道我可以在acceptableIds上用Promise.all进行映射来获取它们,但是对于这种特殊情况,我还需要在其末尾设置onSnapshot(正如您在示例代码中看到的那样),所以不会这样做。

无论如何,最好的方法是什么?

要么可以使用where通过id来获取myCollection的项,要么可以在onSnapshot生成的数组上设置Promise.all。以防万一后者是相关的,以下是该代码:

const acceptableIds = ['id1', 'id2', 'id3']

const myCollectionDispose = await Promise.all(
  acceptableIds.map(id => {
    return db
      .collection('myCollection')
      .doc(id)
      .onSnapshot(doSomething)
  })
)

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将每个Promises保存在一个数组中,然后在每个Promise.all()完成后使用它们。

const acceptableIds = ['id1', 'id2', 'id3']
const promises = []

for (var i = 0; i < acceptableIds.length; i++) {
    promises.push(
        db.collection('myCollection')
        .where('id', 'array-contains', acceptableIds[i])
        .onSnapshot( /* Do Something */ )
    )
}

Promise.all(promises).then(() => {
     // Whatever you need to do next with all the snapshots (e.x. remove them all)
})