Window 加载和 Firebase 身份验证

Window loading and Firebase Authentication

我正在创建一个依赖 Firebase 身份验证并使用 Google Auth 的网站。 用户在单独的页面上登录后,我的网站将用户重定向到“主页”,其中 window 根据登录的用户加载。

但是,如果我检查“window.onload”处是否存在登录用户,它总是错误的。 相反,如果我 运行 一个异步函数,然后在“.then”之后检查登录用户,我会返回 true。

这让我假设“window.onload”的触发速度比页面识别登录用户的速度快。

如何解决此问题并确保在调用我的异步函数之前加载已登录的用户? 我很确定 firebase.auth() 本身是异步的,但出于某种原因 .then 似乎无法使用它。

<script>

  window.onload = loadPage();
  
  function loadPage()
  {
    var user = firebase.auth().currentUser;
    if(user)
      console.log("userFound before async"); //Does NOT console log

    asyncFunction().then(function()
    {
      var user = firebase.auth().currentUser;
      if(user)
        console.log("userFound after async"); //Does console log
    })
}

</script>

如果您想对当前登录的用户执行某些操作,您应该使用 auth state observer 来注册一个回调,该回调会在首次知道用户对象时调用。如您在问题中所述,当页面最初加载时它不可用。

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
    // ...
  } else {
    // User is signed out.
    // ...
  }
});

依赖于其他异步函数的完成是不可取的——使用观察者来确定。只要首次确定用户是否已登录,就会调用它,每次登录状态发生变化时都会调用它。