我正在使用@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))
对象为空。
我假设这与异步调用有关,但我不太清楚如何解决它。不胜感激一些指针。
答案 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)