开发者问题收集

如何在 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