始终返回对象,而不是promises useEffect()

时间:2020-06-24 08:22:17

标签: reactjs google-cloud-firestore react-hooks

我正在尝试从Firestore中的文档“用户”中获取“ isSeller:true”字段,但一直未定义。最终,我意识到useEffect中的用户对象经常返回一个promise(__proto__: object)而不是实际的对象。

function StorefrontPage(props) {
  const auth = useAuth();
  const router = useRouter();
  const [user, setUser] = useState({});

  const uid = auth.user && auth.user.uid;


  useEffect(() => {
    uid && getUser(uid).then(currentUser => {
      setUser(currentUser);
    })
    console.log(user);
  }, [])

  console.log(user);

我第一次运行此命令,它将返回我想要的对象,但是随后的刷新和页面更改将把console.log变成__proto__对象/承诺。我以为将它包装在useEffect挂钩中可以解决此问题,但事实并非如此。如何确保它总是返回用户对象而不是诺言?

作为参考,getUser函数为:

export function getUser(uid) {
  return firestore.collection('users').doc(uid).get().then(user => {
    return user.data();
  })
}

1 个答案:

答案 0 :(得分:1)

从效果上来说,您可以午餐设置状态的功能

useEffect(() => { uid && getUser(uid, setUser)}, [])

并在使用.catch后添加.then

export function getUser(uid, setUser) {
  return firestore.collection('users')
                 .doc(uid).get()
                 .then(user => setUser(user))
                 .catch(err => console.log(err))
}