【发布时间】:2020-11-22 02:53:46
【问题描述】:
我在 Firebase 中有两个表:Vouchers 和 ClaimedVouchers。我正在尝试显示未出现在 ClaimedVouchers 表中的凭证。所以,我有一个获取所有凭证的查询,然后是另一个检查它们是否被认领以及是否被认领的函数应该返回 true 或 false:
这是 isClaimedAPI.js
export default () => {
var result;
async function isClaimed(voucher, user) {
var db = Firebase.firestore();
console.log("voucher");
await db
.collection("ClaimedVoucher")
.where("voucherID", "==", voucher)
.where("userID", "==", user)
.get()
.then(function (querySnapshot) {
if (querySnapshot.empty === false) {
result = true;
} else {
result = false;
}
})
.catch(function (error) {
console.log("Error getting documents: ", error);
});
console.log(result, "this is result");
return result;
//Call when component is rendered
useEffect(() => {
isClaimed().then((result) => setResult(result));
}, []);
return [isClaimed];
然后在我的主要功能中:
var user = Firebase.auth().currentUser;
var uid = user.uid;
const [getVouchers, voucherList, errorMessage] = getVouchersAPI(ID); //List of vouchers to be checked
const [isClaimed] = isClaimedAPI();
return(
<ScrollView>
{voucherList.map((item, index) => {
var voucher = item;
var isVoucherClaimed = isClaimed(voucher.voucherID, uid);
console.log("this is result, ", isVoucherClaimed);
if (
isVoucherClaimed === false
) {
return <Text>{item.name}<Text>
}
})}
</ScrollView>
);
现在什么都没有发生,我收到以下警告:[未处理的承诺拒绝:FirebaseError:函数 Query.where() 需要有效的第三个参数,但它未定义。] 但我认为这与问题无关。
【问题讨论】:
-
您开发的自定义钩子 isClaimedAPI 中似乎没有使用状态。请使用结果作为 isClaimedAPI 中的状态
-
嗨,我已经更新以将结果存储在状态中 - 我已经编辑了我的初始评论 - 你能再看一下吗?现在还有其他问题。
-
不要在异步函数内部设置状态,只返回结果。在 useEffect 中,尝试 `isClaimed().then((result)=>setResult(result)) `
-
啊,我明白你的意思了。但是,我认为我仍然做错了什么。我不确定 isClaimed 将如何访问主程序范围内的 setResult 挂钩?
-
我已经在答案中给出了一个codesandox,请按照如何在自定义钩子中使用setState从异步函数中获取数据
标签: javascript reactjs firebase react-native google-cloud-firestore