如何在 React 中捕捉 Firebase 承诺?
2022-04-13
118
我有一个简单的函数来检查用户是否具有高级访问权限:
export const checkPremium = async () =>{
if (auth.currentUser) {
const q = query(collection(db_firestore, 'users'));
onSnapshot(q, (querySnapshot) => {
querySnapshot.forEach((doc) => {
if (doc.id === auth.currentUser.uid) {
return doc.data().userSettings.hasPremium
}
});
})
}
else{
return false
}
}
我尝试用各种方法捕获此问题,但没有成功,它总是返回一个“未定义”的对象。
const getPremium = async => {
checkPremium.then((response) => console.log(response))
}
const getPremium = async => {
let hasPremium = await checkPremium()
}
let hasPremium = checkPremium()
获取返回的布尔值的正确方法是什么?
1个回答
onSnapshot
用于连续监听集合,并在其值发生变化时反复收到通知。它不会创建承诺,因此 getPremium 返回的承诺与您最终在 onSnapshot 中获取的数据无关。如果您只想获取一次值,则应使用
getDocs
:
export const checkPremium = async () =>{
if (auth.currentUser) {
const q = query(collection(db_firestore, 'users'));
const querySnapshot = await getDocs(q);
const match = querySnapshot.docs.find(doc => doc.id === auth.currentUser.uid);
if (match) {
return doc.data().userSettings.hasPremium);
} else {
return false;
}
}
else{
return false
}
}
此外,您无需获取所有用户,然后使用客户端代码查找具有正确 ID 的用户,而是可以直接获取单个文档:
const ref = doc(db_firestore, 'users', auth.currentUser.uid)
const snapshot = await getDoc(ref);
const data = snapshot.data();
if (data) {
return data.userSettings.hasPremium
} else {
return false
}
Nicholas Tower
2022-04-13