如何在 React 中捕捉 Firebase 的承诺?
How to catch Firebase promise in React?
我有一个简单的函数来检查用户是否具有高级访问权限:
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
}
}
我试图通过各种方式捕捉到它,但运气不好,它总是 returns 一个“未定义”的对象。
const getPremium = async => {
checkPremium.then((response) => console.log(response))
}
const getPremium = async => {
let hasPremium = await checkPremium()
}
let hasPremium = checkPremium()
获取返回布尔值的正确方法是什么?
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
}
我有一个简单的函数来检查用户是否具有高级访问权限:
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
}
}
我试图通过各种方式捕捉到它,但运气不好,它总是 returns 一个“未定义”的对象。
const getPremium = async => {
checkPremium.then((response) => console.log(response))
}
const getPremium = async => {
let hasPremium = await checkPremium()
}
let hasPremium = checkPremium()
获取返回布尔值的正确方法是什么?
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
}