【问题标题】:get asynchronous value from firebase firestore reference从 firebase firestore 参考中获取异步值
【发布时间】: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 的异步性质而发生的,但是如何才能获得分配给该变量的所需值?

【问题讨论】:

    标签: javascript typescript firebase promise google-cloud-firestore


    【解决方案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 不错
    猜你喜欢
    • 1970-01-01
    • 2022-07-01
    • 2019-08-09
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2018-06-16
    相关资源
    最近更新 更多