从 firebase firestore 参考中获取异步值

Posted

技术标签:

【中文标题】从 firebase firestore 参考中获取异步值【英文标题】:get asynchronous value from firebase firestore reference 【发布时间】:2018-12-06 18:19:27 【问题描述】:

我正在尝试从 firebase firestore 数据库中的这个 Promise 中获取名称值:

(至于信息,我有一个地点集合,其中包含一个包含名称的地点和一个引用仅包含名称的所有者文档的 ownerReference。)

var names: any = [];
this.props.places.snapshot.docs.forEach((doc : any) => 
  const place = doc.data()
  place.ownerReference.get().then((snap : any) => 
    name.push(snap.data().name);
    console.log(names);
  )
);
console.log(names);

第一个控制台日志返回所需的数据,最后一个返回一个空对象,我知道这是由于 promise 的异步性质而发生的,但是如何才能获得分配给该变量的所需值?

【问题讨论】:

【参考方案1】:

将每个get() 的所有承诺收集到一个数组中,然后使用 Promise.all() 等待它们全部完成。之后在回调中迭代生成的快照。

const promises = []
this.props.places.snapshot.docs.forEach((doc : any) => 
    const place = doc.data()
    promises.push(place.ownerReference.get())
)

Promise.all(promises).then(snapshots => 
    const names = []
    snapshots.forEach(snapshot => 
        names.push(snapshot.data().name)
    )
    console.log(names);  // this prints what you want
)

【讨论】:

使用 Array.map 更容易 @JonasW。当然,但是 OP 没有使用它,所以我不想把这个问题混为一谈。 得到这个错误:属性 'data' 不存在于类型 '' o 此行 names.push(snapshot.data().name) 没关系,这是一个打字稿问题(没有在快照上指定类型),所以这个答案无疑是正确的,非常感谢 @GustavoFreire 是的,打字稿 d.ts 不错

以上是关于从 firebase firestore 参考中获取异步值的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Firestore 子集合

将大型 json 文件从 Firebase 存储传输到 Firestore

无法使用 SwiftUI 从 Firebase / Firestore 中删除文档

Android中的Firebase:firestore是未解决的参考

Firebase Firestore从数组Javascript查询

Firestore/Firebase 无法从文件夹中获取图像