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