【问题标题】:Window loading and Firebase Authentication窗口加载和 Firebase 身份验证
【发布时间】:2020-07-06 21:57:47
【问题描述】:

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

但是,如果我检查“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>

【问题讨论】:

    标签: javascript firebase firebase-authentication google-authentication


    【解决方案1】:

    如果您想对当前登录的用户做某事,您应该使用auth state observer 注册一个回调,该回调会在首次知道用户对象时被调用。正如您在问题中所描述的那样,它在页面最初加载时不可用。

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

    不建议根据其他异步功能的完成情况 - 使用观察者确定。每当首先确定用户是否登录时都会调用它,并且每次登录状态发生变化时都会再次调用它。

    【讨论】:

    • 我不想在用户登录后立即调用我的函数。相反,我只想在加载“主页”时调用我的函数。在 AuthStateChange 和“主页”加载之间可能存在等待时间。
    • 您必须使用身份验证状态观察器来找出用户对象何时首次可用。它不仅用于检测初始登录。正如我在答案中所说,用户对象在页面首次加载时根本不可用。
    • 其实还有一个问题。在加载我的“主页”时,是否有办法检测用户是否未登录?我假设如果没有登录用户,则不会调用 onAuthStateChanged。
    • 正如我在回答中所说的“只要第一次确定用户是否登录,就会调用它”。所以如果没有,你会得到一个回调。
    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2022-01-20
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多