Обратный вызов/обещание firebase.initializeApp?

Это моя веб-страница

<!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);? Типа обратный звонок..


person gaggina    schedule 30.05.2016    source источник
comment
вы видели этот firebase.google.com/docs/auth/web/manage- пользователи ? это покрывает ваше дело   -  person min che    schedule 30.05.2016


Ответы (2)


инициализировать приложение синхронно. Однако определение текущего состояния пользователя является асинхронным. Правильный способ определить текущее состояние аутентификации — использовать наблюдатель: 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.
  }
});
person bojeil    schedule 31.05.2016
comment
что, если состояние изменилось после загрузки firebase и до того, как я добавил этот обработчик? или если состояние никогда не меняется? - person Jayen; 13.12.2017
comment
Этот прослушиватель также срабатывает при инициализации. - person bojeil; 13.12.2017

Я бы объединил два метода вместе:

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, чтобы дождаться завершения инициализации.

person foxiris    schedule 24.02.2018
comment
Спасибо за отличное решение - person Zim; 15.06.2018