【问题标题】:consistently return objects instead of promises useEffect()始终返回对象而不是承诺 useEffect()
【发布时间】:2020-06-24 08:22:17
【问题描述】:

我正在尝试从 firestore 中的文档“user”中获取“isSeller: true”字段,但一直未定义。最终我意识到 useEffect 中的用户对象通常返回一个承诺 (__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__ object/promise。我认为将它包装在 useEffect 钩子中可以解决这个问题,但事实并非如此。如何确保它始终返回用户对象而不是承诺?

供参考,getUser函数为:

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

【问题讨论】:

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


    【解决方案1】:

    从效果来看,你可以只午餐设置状态的函数

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

    并在使用.then后添加.catch

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

    【讨论】:

    • 把getUser 变成一个异步函数并做return await firestore.colelction(.....) 怎么样?
    • .then 表现得像async,确实这两者之间没有太大区别,FMO,.then 更直接地处理承诺
    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 2020-01-04
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多