【发布时间】:2022-01-06 21:13:23
【问题描述】:
我有一个名为 getRecados() 的异步函数,它可以访问 firebase 并获取我需要我的平面列表来呈现的所有数据:
const getRecados = () => {
setRefreshing(true)
try {
const recadosRef = firebase.firestore().collection('recados');
recadosRef.orderBy('timestamp', 'desc').get().then(snapshot => {
const recadosList = new Array()
// Does some filtering on the data it just grabbed from firebase
if (user_setor.length == 0) {
snapshot.forEach(doc => {
if ((doc.data().curso_dest == user_curso
|| doc.data().curso_dest == '')
&& (doc.data().ano_dest == user_ano
|| doc.data().ano_dest == '')
&& (doc.data().turno_dest == user_turno
|| doc.data().turno_dest == ''))
recadosList.push(doc)
})
} else {
snapshot.forEach(doc => {
if (user_setor.includes(doc.data().remetente)) {
recadosList.push(doc)
}
})
}
// fullData is an useState
setFullData(recadosList.map((doc) => ({
id: doc.id,
titulo: doc.data().titulo,
timestamp: doc.data().timestamp,
remetente: doc.data().remetente,
curso_dest: doc.data().curso_dest,
ano_dest: doc.data().ano_dest,
turno_dest: doc.data().turno_dest,
texto: doc.data().texto
})))
setLoading(false)
setRecados(fullData)
})
} catch (err) {
Alert.alert("Erro ao consultar os recados!!!", err.message);
}
setRefreshing(false)
};
我会在 homeScreen 渲染后立即调用它:
useEffect(() => {
getRecados()
}, []);
但是当我第一次打开 homeScreen 时,flatList 是空的,但是当我使用按钮再次执行 getRecados() 时,flatList 工作正常并显示来自 firebase 的数据,所以这让我得出结论 flatList 正在渲染在 getRecados() 可以第一次设置 fullData 的值之前,如何让它等待 getRecados 完成它所做的一切?
这是平面列表代码:
<FlatList
data={recados}
onRefresh={getRecados}
refreshing={refreshing}
showsVerticalScrollIndicator={false}
renderItem={({ item }) => (
<Card
texto={item.texto}
titulo={item.titulo}
timestamp={item.timestamp}
info1={item.remetente}
info2={
"ao " + item.ano_dest + "º " + item.curso_dest + " " + item.turno_dest
}
/>
)}
/>;
【问题讨论】:
-
还有一些会导致问题的代码。比如你使用了 await 和 then,这会给你带来 promise 的问题。
-
@Ashish 我无法删除异步,因为如果没有等待,代码的 firebase 部分将无法工作。
-
您必须使用
async/await或promise/then。您可以在函数中同时使用这两种方式。 -
@Ashish 我试图将 getRecados 变成一个承诺,但正如我所说,我必须在从 firebase 查询时使用 await 关键字,所以我最终遇到了问题,因为我不能在承诺中使用 await
-
@PriyashreeBhadra 我已经解决了这个问题,刚刚发布了一个答案来解释我是如何做到的。
标签: javascript firebase react-native google-cloud-firestore async-await