我正在使用Firebase的onSnapshot方法来在React Native应用程序中使用实时数据,并编写一个单独的异步函数来监听Firestore,如下所示:
我正在使用useEffect调用此函数,并希望将从firestore返回的订阅器方法作为清理函数返回。我知道可以通过在useEffect函数中直接实现此代码来实现这一点。但由于我正在使用AsyncStorage来检索集合ID,因此需要将其放在异步功能中。由于getData()方法返回promise而不是subscriber function,我无法返回其响应。最好的解决方案是什么?
编辑:
我尝试了以下所有方法来调用useEffect函数内部的函数。
async function getData() {
let collName = await AsyncStorage.getItem('@collection_name')
let subscriber = shopReference.collection(collName).onSnapshot((snap) => {
let menuList = [];
snap.forEach((doc) => {
menuList.push({
id: doc.id,
...doc.data(),
});
});
setMenu(menuList);
});
return subscriber;
}
我正在使用useEffect调用此函数,并希望将从firestore返回的订阅器方法作为清理函数返回。我知道可以通过在useEffect函数中直接实现此代码来实现这一点。但由于我正在使用AsyncStorage来检索集合ID,因此需要将其放在异步功能中。由于getData()方法返回promise而不是subscriber function,我无法返回其响应。最好的解决方案是什么?
编辑:
我尝试了以下所有方法来调用useEffect函数内部的函数。
// Without returning anything, but according to the firestore doc. This may cause data leaks.
useEffect(() => {
getData();
}, []);
// directly returning the method, this cause error that promise cant be accepted as a clean up function.
useEffect(() => {
return getData();
}, []);
useEffect(() => {
getData().then((subscriber) => {
return () => subscriber();
});
}, []);
getItem
完成之前调用以防止订阅者的创建。 - BergigetData
的订阅函数中得到更好的承诺。请展示一下在useEffect
中如何调用它。 - BergiuseEffect
编辑了代码。 - Vikum Dheemantha