从 Firebase 读取数据并将其保存到数组中 - React

Posted

技术标签:

【中文标题】从 Firebase 读取数据并将其保存到数组中 - React【英文标题】:Read Data from Firebase and save it into an Array - React 【发布时间】:2021-09-20 16:57:32 【问题描述】:

我只是想不通为什么我不能将加载的数据保存到数组中。

我正在尝试在数据完全加载后将数据推送到数组中(在 then() 内)

知道为什么它不起作用吗?

非常感谢:)

useEffect(() => 

  fetchData = async () => 
  
  let tempArray = [];
  
  await firebase.firestore().collection('users').get().then((querySnapshot) => 
    querySnapshot.forEach((doc) => 
      firebase.firestore().collection('users').doc(doc.id).collection('posts').get().then((snapShot) => 
        snapShot.forEach((newDoc) => 
          tempArray.push(
            id: doc.id,
            data: newDoc.data()
          )
        )
      )
    )
  )
  
  console.log(tempArray) // Output: Array []
  
  

 fetchData();

, [])

【问题讨论】:

【参考方案1】:

.forEach 不是异步的 - 它不会等待您的内循环 .get()s。您需要执行以下操作:

  await firebase.firestore().collection('users').get().then((querySnapshot) => 
    Promise.all(querySnapshot.map((doc) => 
      firebase.firestore().collection('users').doc(doc.id).collection('posts').get().then((snapShot) => 
        snapShot.forEach((newDoc) => 
          tempArray.push(
            id: doc.id,
            data: newDoc.data()
          )
        )
      )
    )
    )
  )

此外-这似乎非常低效-因为您要获取所有用户和他们的所有帖子,所以您可以只使用一个collectionGroup是一次往返,然后如果您需要排序,请按.parent排序(您在所提供的示例中没有表现出任何此类需求)

await firebase.firestore()..collectionGroup('posts').get().then((querySnapShot) => 
      querySnapShot.forEach((newDoc) => 
        tempArray.push(
          id: doc.id,
          data: newDoc.data()
        )
      )
    )

最后,您将async/await.then() 语法混合在一起,通常不建议这样做:

// .get() is asynchronous
const querySnapShot = await firebase.firestore()..collectionGroup('posts').get();
// push() is synchronous, so need for await
querySnapShot.forEach((newDoc) => 
  tempArray.push(
    id: doc.id,
    data: newDoc.data()
  )
)

【讨论】:

以上是关于从 Firebase 读取数据并将其保存到数组中 - React的主要内容,如果未能解决你的问题,请参考以下文章

Firebase读取/保存数据以将其用作列表|斯威夫特/火力地堡

如何从firebase数据库中检索数据作为字符串而不是字典并将其添加到数组中?

从String中提取数字并将其保存到数组中

如何从 SQL Server 表中读取图像数据(存储 word 文档)并将其保存到本地文件夹

使用嵌套地图检索数据并将其保存到 Firebase - Flutter [关闭]

从Firebase数据库中获取子代数,并将其放在一个数组列表中。