firebase.initializeAppcallback/promise?

firebase.initializeApp callback/promise?

这是我的网页

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Calcolo Diliuzioni</title>

    </head>
    <body>

        <h1>My app</h1>

        <!-- Libreria per gestire l'autenticazione con google -->
        <script src="https://apis.google.com/js/platform.js" async defer></script>

        <!-- Firebae config -->
        <script src="https://www.gstatic.com/firebasejs/live/3.0/firebase.js"></script>
        <script>
        // Initialize Firebase
        var config = {
        apiKey: "",
        authDomain: "",
        databaseURL: "",
        storageBucket: "",
        };
        firebase.initializeApp(config);
        </script>

        <script type="text/javascript">
            var user = firebase.auth().currentUser;
            if (user) {
                console.log(user);
            } else {
                console.log(user);
            }
        </script>
    </body>
</html>

假设我有一个已经登录的用户。当我在控制台中加载页面时,我得到了 null。虽然我期望拥有当前用户的对象。

如果我运行在浏览器控制台中使用相同的代码

var user = firebase.auth().currentUser;
if (user) {
    console.log(user);
} else {
    console.log(user);
}

我能够获取当前用户的对象。

我认为 firebase.initializeApp(config); 有一些异步行为。解决它的正确方法是什么?我应该在 firebase.initializeApp(config); 函数上使用承诺或其他东西吗?一种回调..

初始化应用程序是同步的。但是,确定当前用户状态是异步的。确定当前身份验证状态的正确方法是使用观察者: https://firebase.google.com/docs/auth/web/manage-users

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in and currentUser will no longer return null.
  } else {
    // No user is signed in.
  }
});

我会结合两种方法:

function canActivate(){
    return new Promise(resolve => {
        if (firebase.auth().currentUser) {
            resolve(true);
        } else {
            const unsubscribe = firebase.auth().onAuthStateChanged(function (user) {
                unsubscribe();
                if (user) {
                    resolve(true);
                } else {
                    resolve(false);
                }
            });
        }
    });
}

在 SPA,如果用户已经登录并且用户可以转到任何页面,则获得 firebase.auth().currentUser == true。 但是如果用户重新加载页面,得到 firebase.auth().currentUser == false。 用户需要等待 firebase.initializeApp(config); 完成,所以添加 firebase.auth().onAuthStateChanged 等待初始化完成。