2016-05-30 3 views
3

Это мой веб-страницаfirebase.initializeApp callback/обещание?

<!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);? Вид обратного вызова.

+0

Вы видели это https://firebase.google.com/docs/auth/web/manage-users? он охватывает ваш случай –

ответ

8

Инициализировать приложение синхронно. Однако определение текущего состояния пользователя является асинхронным. Правильный путь для определения текущей аутентификации состояния является использование наблюдателя: 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. 
    } 
}); 
+0

Что делать, если состояние изменилось после загрузки firebase и до того, как добавить этого обработчика? или если государство никогда не меняется? – Jayen

+1

Этот прослушиватель запускает и инициализацию. – bojeil

0

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

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, чтобы подождать init завершен.

Смежные вопросы