从Firebase查询返回结果数组

时间:2020-07-13 21:19:28

标签: javascript reactjs firebase react-native google-cloud-firestore

我正在使用@react-native-firebase包装器与Firebase的Firestore进行交互。我有一个函数可以对我的一个集合进行一些查询,预期的响应应该是一个包含每个找到的文档的Array对象。

我的功能当前如下:

export const backendCall = async => {
  let response = [] 
  firestore()
  .collection('collection')
  .where('id', '==', 1)
  .onSnapshot(documentSnapshot => {
    documentSnapshot.forEach(x => response.push(x.data())) 
  })
  return response 

在我的UI上,我使用了react-native Button组件,该组件调用了此功能onPress

<Button 
  title="get" 
  onPress={() => {
    backendCall().then(response => console.log(response)) 
  }}
/> 

使用console.log可以观察到预期的Array对象(但是带有“刚刚在下面评估了值”图标。但是,如果我将onPress更改为{{ 1}},则console.log(JSON.stringify(response))对象为空。

我假设这与异步调用有关,但我不太清楚如何解决它。不胜感激一些指针。

1 个答案:

答案 0 :(得分:1)

您将返回响应,而无需等待Firebase查询的结果。要在返回之前等待响应到达,可以使用Promise。

export const backendCall = () => {
    return new Promise(resolve => {
        firestore()
            .collection('collection')
            .where('id', '==', 1)
            .onSnapshot(documentSnapshot => {
                const response = []
                documentSnapshot.forEach(x => response.push(x.data()))
                resolve(response)
            })
    })
}

您可以使用Array.map使for循环看起来更好。

const response = documentSnapshot.map(x => x.data())
resolve(response)