【问题标题】:How to return data from Firestore promise?如何从 Firestore 承诺返回数据?
【发布时间】:2020-09-23 09:39:54
【问题描述】:

我有这段代码,它返回某个文档的父母。 console.log(doc.ref.parent.get()) 我使用 collectionGroup 来搜索是否存在与登录到应用程序的用户的电子邮件相同的用户机智电子邮件。

var nameRef = db
    .collectionGroup('Users')
    .where('email', '==', currentUser.email)

  useEffect(() => {
    nameRef.get().then((snapshot) => {
      snapshot.docs.forEach((doc) => {
        console.log(doc.ref.parent.get())
      })
    })
  }, [])

它返回一个承诺:

如何访问 PromiseResult 中 qf 中 Path 中的 segments Array。我尝试了一些对象重组,但没有成功。

【问题讨论】:

  • 请分享整个相关代码sn-p。 docrefparent 已经是什么?
  • 我用相关代码更新了帖子。
  • 感谢您的更新。为什么要访问segments 属性?
  • 因为在segments上有用户所属的主集合中的所有集合和文档。简单地说,我想获取属于已登录用户的文档。

标签: javascript firebase google-cloud-firestore promise


【解决方案1】:

你的代码有几个问题:

#1/ 在 useEffect 函数中不会返回任何内容。

#2/doc.ref.parent.get() 是异步的,将立即返回并返回一个承诺。问题是forEach() 循环不会等待这些承诺被履行。查看更多解释here。一种经典的解决方案是使用Promise.all(),如下所示。

#3/ 最后但同样重要的是,请注意您的 useEffect 函数是异步的。

所以,以下应该可以解决问题:

  var nameRef = db
        .collectionGroup('Users')
        .where('email', '==', currentUser.email);

  useEffect(() => {
        return nameRef.get().then((snapshot) => {
            const promises = [];
            snapshot.docs.forEach((doc) => {
                promises.push(doc.ref.parent.get());
            });
            return Promise.all(promises);
        });
  }, []);

  // Call the function as follows, with a then() block or use the async/await keywords
  useEffect().then((results) => {   // results is an Array of DocumentSnapshots
    results.forEach((r) => {
      console.log(r.get('segments')); 
    });
  }); 
  

【讨论】:

  • 感谢您的帮助。我尝试了您编写的代码,但我得到 Cannot read property 'then' of undefined 错误。似乎 .then 函数没有返回任何内容。
  • 我已经解决了对象解构的错误。谢谢你的时间:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2021-04-18
  • 2020-07-17
  • 1970-01-01
  • 2015-03-14
相关资源
最近更新 更多