【发布时间】:2022-11-15 06:56:46
【问题描述】:
我创建了这个自定义挂钩来获取(在本例中为收听)firestore 中的文档:
import { doc, onSnapshot } from 'firebase/firestore';
import { useEffect, useState } from 'react';
import { db, auth } from '../../firebase';
function useCurrentUser() {
const userId = auth.currentUser.uid;
const [user, setUser] = useState({});
const [isUserLoading, setIsUserLoading] = useState(false);
const [isUserError, setIsUserError] = useState(null);
useEffect(() => {
const getUser = async () => {
try {
setIsUserLoading(true);
const userRef = doc(db, 'users', userId);
const unsub = await onSnapshot(userRef, doc => {
setUser(doc.data());
});
} catch (error) {
setIsUserError(error);
} finally {
setIsUserLoading(false);
}
};
getUser();
}, []);
return { user, isUserLoading, isUserError };
}
export default useCurrentUser;
问题是:isUserLoading 总是返回false,即使在try 语句中,我将它设置为true
知道为什么会这样吗?
【问题讨论】:
-
你确定
onSnapshot返回一个你可以等待的承诺吗?看起来不像 -
你是对的。我多么愚蠢。我再次检查了 firebase 文档firebase.google.com/docs/firestore/query-data/listen 谢谢!
-
即使在删除
await之后,isUserLoading仍然总是返回false -
try or catch 后不是总被叫到吗?